Laden...

XML einlesen

Letzter Beitrag vor einem Jahr 5 Posts 610 Views
XML einlesen

Hallo zusammen,

ich würde gern eine XML Datei verarbeiten und komme nicht weiter.

Wie kann ich die Values der einzelenen Elemente aus dispatch_status_entriesabfragen?

XML

<?xml version="1.0" encoding="UTF-8"?>
<start>
    <status>offen</status>
    <timestamp>10/19/2023 17:03:27</timestamp>
    <tour_number>6100464638</tour_number>
    <location>Mein Standort</location>
    <dispatch_status_entries>
        <entry qualifier="dispatch.status.entrance">10/19/2023 01:00</entry>
        <entry qualifier="dispatch.status.editing">10/19/2023 02:00</entry>
        <entry qualifier="dispatch.status.loading.end">10/19/2023 03:00</entry>
    </dispatch_status_entries>
</start>

Versuch1

XmlDocument doc = new XmlDocument();
doc.Load("d:/123.xml");

string str0 = "0 = " + doc.DocumentElement.ChildNodes[0].InnerText;
string str1 = "1 = " + doc.DocumentElement.ChildNodes[1].InnerText;
string str2 = "2 = " + doc.DocumentElement.ChildNodes[2].InnerText;
string str3 = "3 = " + doc.DocumentElement.ChildNodes[3].InnerText;
string str4 = "4 = " + doc.DocumentElement.ChildNodes[4].InnerText;
string str5 = "5 = ???";
string str6 = "6 = ???";

MessageBox.Show(str0 + Environment.NewLine + str1 + Environment.NewLine + str2 + Environment.NewLine + str3 + Environment.NewLine + str4 + Environment.NewLine + str5 + Environment.NewLine + str6);

Hier bekomme ich alle Unterelemente aus dispatch_status_entrieshintereinander aufgelistet.

Versuch2

XmlDocument doc = new XmlDocument();
doc.Load("d:/123.xml");

str0 = "0 = " + doc.DocumentElement.ChildNodes[0].InnerText;
str1 = "1 = " + doc.DocumentElement.ChildNodes[1].InnerText;
str2 = "2 = " + doc.DocumentElement.ChildNodes[2].InnerText;
str3 = "3 = " + doc.DocumentElement.ChildNodes[3].InnerText;

var parentNode = doc.SelectNodes("//start//dispatch_status_entries");
foreach (XmlNode subNode in parentNode)
{
    str4 = "4 = " + subNode["entry"].InnerText;
    str5 = "5 = " + subNode["entry"].GetAttribute("qualifier", "dispatch.status.editing").ToString();
    str5 = "5 = " + subNode["entry"].GetAttribute("qualifier", "dispatch.status.end").ToString();
}

MessageBox.Show(str0 + Environment.NewLine + str1 + Environment.NewLine + str2 + Environment.NewLine + str3 + Environment.NewLine + str4 + Environment.NewLine + str5 + Environment.NewLine + str6);

Unter Punkt 4 bekomme ich das erste Element aus dispatch_status_entriesaufgelistet.

Bei 5 & 6 wird nichts ausgegeben

Kann mir hier wer ein tipp geben, wie ich das richtig umsetze kann?.

Hallo,

dein 2. Ansatz ist schon auf dem richtigen Weg, aber der Rückgabewert von XmlNode.SelectNodes ist die Liste der gefunden Elemente (sonst könnte man ja gar nicht die Schleife damit benutzen), also

var parentNodes = doc.SelectNodes("//start//dispatch_status_entries");
foreach (XmlNode parentNode in parentNodes)
  foreach (XmlNode subNode in parentNode.ChildNodes)

// oder alternativ
var subNodes = doc.SelectNodes("//start//dispatch_status_entries//*"); // navigiere mit * explizit alle Unterelemente
foreach (XmlNode subNode in subNodes)

Bisher hast du mit subNode["entry"] immer nur auf den ersten Untereintrag zugegriffen.

Und dann kannst du bei jedem subNode direkt auf den InnerText sowie die Attribute zugreifen:

str4 = "4 = " + subNode.InnerText;
str5 = "5 = " + subNode.GetAttribute("qualifier").ToString();

Bedenke, daß nach der Schleife in str4und str5jeweils nur die Texte des letzten entry-Eintrags stehen, da diese (bisher) immer wieder neu zugewiesen werden!

Bedenke, daß nach der Schleife in str4und str5jeweils nur die Texte des letzten entry-Eintrags stehen, da diese (bisher) immer wieder neu zugewiesen werden!

Habe es mal so versucht,

foreach (XmlNode subNode in doc.SelectNodes("//start//dispatch_status_entries"))
           {
               MessageBox.Show(subNode.InnerText);
           }

dann gibt er mir ein Messengerbox mit allen 3 Values

Ergebniss: 10/19/2023 01:0010/19/2023 02:0010/19/2023 03:00

Ich hätte mir nach deiner aussage eher vorgestellt, dass es mir 3 Messenger ausgibt mit je einem Datum/Zeit

Sorry, hatte gerade meinen Beitrag noch mal editiert (da er leicht fehlerhaft war).

PS:

Beim Zugriff auf die Attribute muß vorher überprüft werden, ob der XmlNode ein XmlElement ist (denn nur diese abgeleitete Klasse besitzt die entsprechende Methode), also z.B.

if (subNode is XmlElement subElement)
  string s = subElement.GetAttribute("qualifier").ToString();

Ich habe die lösung, Danke für dien Tipp

            string str4 = "??";
            string str5 = "??";
            string str6 = "??";

            XmlDocument doc = new XmlDocument();
            doc.Load("d:/123.xml");

            string str0 = "0 = " + doc.DocumentElement.ChildNodes[0].InnerText;
            string str1 = "1 = " + doc.DocumentElement.ChildNodes[1].InnerText;
            string str2 = "2 = " + doc.DocumentElement.ChildNodes[2].InnerText;
            string str3 = "3 = " + doc.DocumentElement.ChildNodes[3].InnerText;

            XmlNodeList itemNodes = doc.GetElementsByTagName("entry");
            if (itemNodes.Count > 0)
            {
                foreach (XmlElement node in itemNodes)
                {
                    switch (node.Attributes["qualifier"].Value.ToString())
                    {
                        case "dispatch.status.entrance":
                            str4 = node.ChildNodes[0].InnerText;
                            break;
                        case "dispatch.status.editing":
                            str5 = node.ChildNodes[0].InnerText;
                            break;
                        case "dispatch.status.loading.end1":
                            str6 = node.ChildNodes[0].InnerText;
                            break;
                        default:
                            MessageBox.Show(node.Attributes["qualifier"].Value.ToString() + " Nicht bekann!"); 
                            break;
                    }
                }

            MessageBox.Show(str0 + Environment.NewLine + str1 + Environment.NewLine + str2 + Environment.NewLine + str3 + Environment.NewLine + str4 + Environment.NewLine + str5 + Environment.NewLine + str6);