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_entries
abfragen?
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_entries
hintereinander 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_entries
aufgelistet.
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 str4
und str5
jeweils nur die Texte des letzten entry
-Eintrags stehen, da diese (bisher) immer wieder neu zugewiesen werden!
Bedenke, daß nach der Schleife in
str4
undstr5
jeweils nur die Texte des letztenentry
-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);