Werte aus XML-Datei Einlesen


Henig

Mitglied
Guten Tag liebe Leute,

Heute bin ich mal mit C# unterwegs und mir fehlen mal komplette ansätze...

Ich habe eine XML-Datei die Hunderter, Zehner und Einer Definieren soll.
Das HunderterElement beinhaltet das Attribut 'Wert' und das Element Zehner, was wiederrum auch ein Attribut 'Wert' enthält, so wie das das Element Einer, was AUCH wiederrum das Attribut 'Wert' enthält.
Folgender Code:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Layer>
	<Hunderter>
		<Zehner>
			<Einer>
				<Wert>2</Wert>
			</Einer>
			<Wert>5</Wert>
		</Zehner>
		<Wert>6</Wert>
             </Hunderter>
</Layer>

Jetzt will ich in meiner Console ausgeben, das der Hunderter den Wert X besitzt, der Zehner seinen Wert und der Einer Seinen Wert.

Bisher habe ich das mit dem XmlReader versucht um das erste Element ausfindig zu machen (Hunderter). Wenn dies geschehen ist soll er den in 'Hunderter' stehenden 'Wert' an eine Stringvariable zurückgeben.

Wenn ich jetzt aber Folgendes mache:

Code:
XmlReader reader;
reader.Create("C:/test.xml");
string[] Werte = {"Hunderter", "Zehner", "Einer"}
int index = 0;


while(index-1 != Werte.Length)
{

while(reader.Read())
{

if(string.Compare(reader.Name.ToString(), Werte[i]))
{
reader.ReadNextElement("Wert");
Console.WriteLine(reader.ReadString());
}

}

index = index +1;
}

Bekommt er ja nicht den Wert von dem Hunderter sondern den ersten Wert den er findet und das ist ja der Einer.



Jetzt wurde mir vorgeschlagen das ich doch XmlDocument nutzen kann aber damit kenne ich mich in keinster weise aus... ich hab mir das mal angesehen aber irgentwie stehe ich da komplett auf dem schlauch...

erbitte dringent Hilfe danke Vielmals ;)


PS: Ich arbeite Mit Visual Studio 2005
 
Zuletzt bearbeitet von einem Moderator:

napstermania

Mitglied
Hallo Henig,

ich bin mir jetzt nicht sicher ob im VS2005 das unterstützt wird, aber der folgende Code sollte dir schonmal weiter helfen.

C#:
static void Main(string[] args)
        {
            XmlTextReader reader = new XmlTextReader("test.xml");
            var xmlContent = XElement.Load(reader);

            var xmlSectionH = xmlContent.Element("Hunderter");
            var xmlKeyH = xmlSectionH.Element("Wert");
            string valueH = xmlKeyH.Value;
            Console.WriteLine("Hunderter wert: " + valueH);

            var xmlSectionZ = xmlSectionH.Element("Zehner");
            var xmlKeyZ = xmlSectionZ.Element("Wert");
            string valueZ = xmlKeyZ.Value;
            Console.WriteLine("Zehner wert: " + valueZ);

            var xmlSectionE = xmlSectionZ.Element("Einer");
            var xmlKeyE = xmlSectionE.Element("Wert");
            string valueE = xmlKeyE.Value;
            Console.WriteLine("Einer wert: " + valueE);
            
            Console.ReadLine();
        }

Gruß
 

Henig

Mitglied
okay, soweit sogut verständlicher code danke aufjedenfall schonmal dafür =)

aber ich bekomme bei den "var"s die Fehlermeldung:
Fehler 1 Der Typ- oder Namespacename "var" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?) C:\Dokumente und Einstellungen\esn.lua\Eigene Dateien\Visual Studio 2005\Projects\XmlDocument Test\XmlDocument Test\Program.cs 14 13 XmlDocument Test

muss ich noch irgentwas hinzufügen, damit das var für den compiler verständlich ist?
 

napstermania

Mitglied
Hallo,

der Datentyp var ist erst in .NET 3.5 verwendbar. Also erst ab VS2008. Aber wenn du anstatt var direkt das XElement nimmst sollte es auch gehen.

Gruß
 

Henig

Mitglied
Danke dir dafür =)

Ich habe jetzt noch einen zweiten weg gefunden, den ich über XmlDocument gelöst habe:
Code:
XmlDocument doc = new XmlDocument();
doc.Load(test.txt);

System.Xml.XmlNode node;
System.Xml.XmlElement root = doc.DocumentElement;

node = root.SelectSingleNode("//Hunderter/Wert");
Console.WriteLine(node.InnerXml);

node = root.SelectSingleNode("//Zehner/Wert");
Console.WriteLine(node.InnerXml);

node = root.SelectSingleNode("//Einer/Wert");
Console.WriteLine(node.InnerXml);

Ich freu mich grade totel das ich den mist endlich zusammengewurstelt bekommen habe danke euch, die sich mein Problem wenigstens angesehen haben ^^
 

Henig

Mitglied
Neues Problem aber gleiches Thema....
Ich arbeite grade an ner neuen XML-Datei, für die ich mich jetzt in die XmlDocument-Klasse eingelesen habe...

Ich habe in den Hunderter Zehner und Einer elementen jeweils ein ID-Attribut.

XML:
<Layer>
<Hunderter ID = 1>
<Zehner ID = 2>
<Einer ID = 3>
<WertElement>
<Wert>2</Wert>
</WertElement>
</Einer>
<WertElement>
<Wert>2</Wert>
</WertElement>
</Zehner>
<WertElement>
<Wert>2</Wert>
</WertElement>
</Hunderter>
</Layer>

Wie komme ich jetzt mithilfe von XmlDocument z.B. auf den Inhalt von (In XPath ausgedrückt: "/Layer/Hunderter/WertElement/Wert", ohne XPath selber zu nutzen und mithilfe der ID also SQL-Mäßig: " WHERE ID = 1"! Das Programmd as ich schreibe will ich variabel haben udn evtl noch teusender etc hinzufügen ^^


Vielen dankfür eure Hilfe und Grüße ^^
 
Zuletzt bearbeitet von einem Moderator:

Henig

Mitglied
weil ich mithilfe von XPath nur die nodes herausfinden kann und nicht die elemente an sich... Ich habe eine funktion an die ich ein Element übergeben muss und weiß auch nicht ob/wie ich ein XmlNode zu einem XmlElement umwandeln kann.
 

deepthroat

Erfahrenes Mitglied
weil ich mithilfe von XPath nur die nodes herausfinden kann und nicht die elemente an sich... Ich habe eine funktion an die ich ein Element übergeben muss und weiß auch nicht ob/wie ich ein XmlNode zu einem XmlElement umwandeln kann.
Ein XmlElement ist ein XmlNode. (Vererbung)

Falls du mit dem XPath ein Element ansprichst, wird auch ein XmlElement zurückgeliefert:
C#:
XmlElement e = (XmlElement)doc.SelectSingleNode("/Layer/Hunderter/WertElement/Wert");
Gruß
 

Henig

Mitglied
Vielen dank für die info das bringt mich schonmal ein stück weiter meine funktion allerdings mag es nicht, dass ich aus einem XmlNode-Array eine instanz zu einem XmlElement caste...

C#:
SignedXml sx = null;
sx.LoadXml((XmlElement)nodeArray[0]);
Unbekannte Transformation gefunden.

Edit: nodeArray ist natürlich ein XmlNode[]
 
Zuletzt bearbeitet: