Benutzer mit den meisten Antworten
xml-Datei auslesen

Frage
-
Hallo,
wie kann ich in einer xml-Datei direkt auf einen Knoten zugreifen?
In meinem Fall auf 'coItem id="1"' und mir alle darunterliegenden Knoten und deren Werte auflisten.Alexander
var xmlDocument = new XmlDocument(); xmlDocument.Load(fileName);
<configData> <header> </header> <seData> <version>1.000</version> <dic> </dic> <paper> <right> <item id="1"> <type>K23</type> <coItem id="207"> <prop1>A</prop1> <prop2>A</prop2> <prop3>A</prop3> </coItem> </item> </right> </paper> </setData> </configDta>
Antworten
-
Hallo Alexander,
ich würde eher Linq To Xml einsetzen, damit ist da navigieren durch die Elemente leichter.
da nicht so ganz klar ist ob Du item (wegen der id=1) oder coItem (hat id=207), gehe ich mal von item aus und habe mich auf setData (anstatt seData) geeinigt:
internal static void GetConfigNodes() { var document = XDocument.Parse("<configData>" + "<header></header>" + "<setData>" + "<version>1.000</version>" + "<dic></dic>" + "<paper>" + "<right>" + "<item id=\"1\">" + "<type>K23</type>" + "<coItem id=\"207\">" + "<prop1>A</prop1>" + "<prop2>B</prop2>" + "<prop3>C</prop3>" + "</coItem>" + "</item>" + "</right>" + "</paper>" + "</setData>" + "</configData>"); XElement item = document.Root .Element("setData") // in setData (oder seData?) .Descendants("item") // untergeordnete "item" Elemente auflisten .Where(e => (int)e.Attribute("id") == 1) // und das mit der id = 1 suchen .FirstOrDefault(); // erstee oder null (wenn nicht vorhanden) if (item == null) { Console.WriteLine("Item not found."); } else { // Durchlaufen der Elemente foreach (var element in item.Elements()) { if (element.Name == "coItem") { Console.WriteLine($"Co Item Id = {(int)element.Attribute("id")}"); // untergeordnete PropN foreach (var prop in element.Elements()) { Console.WriteLine($"\tProperty {prop.Name} = {prop.Value}"); } } else { // Sonst element direkt Console.WriteLine($"Element {element.Name} = {element.Value}"); } } } }
Soll es unbedingt ein XmlDocument sein, ginge es ähnlich nur müsstest Du SelectSingleNode / SelectNodes verwenden, um in dem Dokument zu auszuwählen, siehe Auswählen von Knoten mithilfe der XPath-Navigation, verbunden mit einer Bastelstunde in XPath Ausdrücken.
Gruß Elmar
- Als Antwort markiert AlexanderRi Mittwoch, 12. Oktober 2016 15:29
Alle Antworten
-
Hallo Alexander,
ich würde eher Linq To Xml einsetzen, damit ist da navigieren durch die Elemente leichter.
da nicht so ganz klar ist ob Du item (wegen der id=1) oder coItem (hat id=207), gehe ich mal von item aus und habe mich auf setData (anstatt seData) geeinigt:
internal static void GetConfigNodes() { var document = XDocument.Parse("<configData>" + "<header></header>" + "<setData>" + "<version>1.000</version>" + "<dic></dic>" + "<paper>" + "<right>" + "<item id=\"1\">" + "<type>K23</type>" + "<coItem id=\"207\">" + "<prop1>A</prop1>" + "<prop2>B</prop2>" + "<prop3>C</prop3>" + "</coItem>" + "</item>" + "</right>" + "</paper>" + "</setData>" + "</configData>"); XElement item = document.Root .Element("setData") // in setData (oder seData?) .Descendants("item") // untergeordnete "item" Elemente auflisten .Where(e => (int)e.Attribute("id") == 1) // und das mit der id = 1 suchen .FirstOrDefault(); // erstee oder null (wenn nicht vorhanden) if (item == null) { Console.WriteLine("Item not found."); } else { // Durchlaufen der Elemente foreach (var element in item.Elements()) { if (element.Name == "coItem") { Console.WriteLine($"Co Item Id = {(int)element.Attribute("id")}"); // untergeordnete PropN foreach (var prop in element.Elements()) { Console.WriteLine($"\tProperty {prop.Name} = {prop.Value}"); } } else { // Sonst element direkt Console.WriteLine($"Element {element.Name} = {element.Value}"); } } } }
Soll es unbedingt ein XmlDocument sein, ginge es ähnlich nur müsstest Du SelectSingleNode / SelectNodes verwenden, um in dem Dokument zu auszuwählen, siehe Auswählen von Knoten mithilfe der XPath-Navigation, verbunden mit einer Bastelstunde in XPath Ausdrücken.
Gruß Elmar
- Als Antwort markiert AlexanderRi Mittwoch, 12. Oktober 2016 15:29
-
Hallo AlexanderRi,
ich denke mit SelectNodes und XPath kommst Du am besten zum Ziel.
Zur Anwendung einfach das Beispiel in der MSDN ansehen: XmlNode.SelectNodes-Methode (String)
Gruß
- Florian