![]() |
Mit XPath Knoten auswählen liefert alle Knotenwerte
Ich habe einen etwas komischen Effekt, den ich nicht verstehe.
Hier erst mal die zu Grunde liegende X;ML-Datei:
XML-Code:
Das ist nur ein Auschnitt.
<Catalog role="STANDARD">
<businessSupplier companyName="DATAWERK" id="1"> <businessRelationships> <businessRelationship id="1"> </businessRelationship> </businessRelationships> </businessSupplier> <Categories> <Category name="Testkategorie 1" id="1"> <items> <item name="Testitem 1.a" id="1" orderable="true"> <shortdescription>Kurzbeschreibung des Produktes</shortdescription> <longdescription>Ausführliche, lange Beschreibung des Produktes</longdescription> <itemIdentifier>C3-45-87</itemIdentifier> </item> <item name="Testitem 1.b" id="2" orderable="true"> </item> <item name="Testitem 1.c" id="3" orderable="true"> </item> <item name="Testitem 1.d" id="4" orderable="true"> </item> </items> </Category> Jetzt wähle ich mittels XPath den Knoten items aus und iteriere durch die unterknoten:
Code:
Innerhalb der Schleife versuche ich auf die Unterelemente eines Items zu zugreifen. Komischerweise steht nach dem Aufruf von
nodeIter = nav.Select("/Catalog/Categories/Category[@name=\"" + name + "\"]/items/*");
while (nodeIter.MoveNext()) { ProductItem prodItem = new ProductItem(); prodItem.Name = nodeIter.Current.GetAttribute("name", ""); nodeProduct = nav.Select("/Catalog/Categories/Category[@name=\"" + name + "\"]/items/item/shortdescription"); nodeProduct.MoveNext(); prodItem.ShortDescription = nodeIter.Current.Value; nodeProduct = nav.Select("/Catalog/Categories/Category[@name=\"" + name + "\"]/items/item/longdescription"); nodeProduct.MoveNext(); prodItem.LongDescription = nodeIter.Current.Value; nodeProduct = nav.Select("/Catalog/Categories/Category[@name=\"" + name + "\"]/items/item/itemIdentifier"); nodeProduct.MoveNext(); prodItem.ItemIdentifier = nodeIter.Current.Value; productList.Add(prodItem); }
Code:
auch schon alle anderen Elemente in der Eigenschaft. Er hat sie also irgendwie alle auf einmal ausgelesen. das ist natürlich nicht brauchbar. Was muss ich anders machen, damit ich gezielt auf die Elemente zugreifen kann?
prodItem.ShortDescription = nodeIter.Current.Value;
|
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Das innere Select weiß ja nichts vom äußeren, genauer gesagt von dessen "Current"-Knoten. Also bekommst du mit "/item" im zweiten XPath wieder alle item-Elemente. Die zwei Abfragen müssen aufeinander aufbauen:
Code:
PS: XPath ist quasi schon wieder out, lang lebe XLinq :mrgreen: . Aber da .Net 3.5 für euch wahrscheinlich ein no-go sein dürfte, dürfte XPath wirklich noch das Erträglichste sein.
while (nodeIter.MoveNext()) {
var nodeProduct = nodeIter.Current.Select("shortdescription"); nodeProduct.MoveNext(); Console.WriteLine(nodeProduct.Current.Value); [...] |
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Auch wenn ich so mache, wie du habe ich wieder alle Werte:
Code:
nav = docNav.CreateNavigator();
nodeIter = nav.Select("/Catalog/Categories/Category[@name=\"" + name + "\"]/items/*"); while (nodeIter.MoveNext()) { ProductItem prodItem = new ProductItem(); prodItem.Name = nodeIter.Current.GetAttribute("name", ""); nodeProduct = nodeIter.Current.Select("shortdescription"); nodeProduct.MoveNext(); prodItem.ShortDescription = nodeIter.Current.Value; productList.Add(prodItem); } |
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Die Eigenschaft nicht mit "nodeIter" sondern mit "productNode" befüllen ;) . Hatte es in meinem Code (WriteLine) korrigiert, aber vergessen, nochmal explizit darauf hinzuweisen.
|
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Jetzt sehe ich es auch. :wall:
|
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Was für eine "Komponente" verwendest du?
Doch nicht XMLDocument, XMLNode, etc. oder? Geht mich ja nichts an, aber "MoveNext" ist absolut unschön und fehlerträchtig. Überhaupt das durchgehen durch den XML-Baum. Ich würde komplett auf XPATH setzen. Mit SelectSingleNode oder SelectNodes das entsprechende auswählen, mit einer foreach-Schleife oder je nach Bedarf switch-case die einzelnen Elemente abfragen (Node.Name) und dann die Werte auslesen. |
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Zitat:
Geht mich ja nichts an, aber "MoveNext" ist absolut unschön und fehlerträchtig. Überhaupt das durchgehen durch den XML-Baum. Zitat:
|
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Ja dass du mit .NET und C# arbeitest, ist mir klar.
Aber da selektiert man mit XPATH die Nodes oder den Node, die/den man haben will und arbeitet sich dann mit foreach durch die Nodelist ;-) Folgender Code ist absolut sicher, egal wie die XML-Datei aussieht:
Code:
da ich den Code selbst getestst habe, sind im Code einige Dinge, die ich dafür benötigt habe (textbox1, usw.)
string name = "Testkategorie 1";
XmlDocument XMLDoc = new XmlDocument(); XMLDoc.LoadXml(textBox1.Text); List<ProductItem> prodList = new List<ProductItem>(); XmlNodeList NodeList = XMLDoc.SelectNodes("//Catalog/Categories/Category[@name=\"" + name + "\"]/items/item"); foreach (XmlNode ItemNode in NodeList) { ProductItem prodItem = new ProductItem(); XmlNode NodeAttr = ItemNode.Attributes.GetNamedItem("name"); if (NodeAttr != null) { prodItem.Name = NodeAttr.Value; } foreach (XmlNode ItemChildNode in ItemNode.ChildNodes) { switch (ItemChildNode.Name) { case "shortdescription": prodItem.ShortDescription = ItemChildNode.InnerText; break; case "longdescription": prodItem.LongDescription = ItemChildNode.InnerText; break; case "itemIdentifier": prodItem.ItemIdentifier = ItemChildNode.InnerText; break; } } prodList.Add(prodItem); } |
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Werde ich mir am Dienstag an der Arbeit mal etwas genauer angucken. Danke für den Hinweis.
|
Re: Mit XPath Knoten auswählen liefert alle Knotenwerte
Zitat:
Am Anfang ist es normal beim Umstieg von Delphi nach C#, dass man die alten Gewohnheiten weiterpflegt. Wenn man aber erstmal das Konzept von C# verstanden hat, wird man nie wieder Delphi benutzen wollen ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz