none
xml-Datei auslesen RRS feed

  • 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>

    Dienstag, 11. Oktober 2016 16:37

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
    Dienstag, 11. Oktober 2016 19:24
    Beantworter

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
    Dienstag, 11. Oktober 2016 19:24
    Beantworter
  • 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

    Mittwoch, 12. Oktober 2016 07:02