AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML C# Mit XPath Knoten auswählen liefert alle Knotenwerte

Mit XPath Knoten auswählen liefert alle Knotenwerte

Ein Thema von Luckie · begonnen am 9. Mai 2008 · letzter Beitrag vom 29. Mai 2008
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 12:34
Ich habe einen etwas komischen Effekt, den ich nicht verstehe.

Hier erst mal die zu Grunde liegende X;ML-Datei:
XML-Code:
<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>
Das ist nur ein Auschnitt.
Jetzt wähle ich mittels XPath den Knoten items aus und iteriere durch die unterknoten:
Code:
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);              
            }
Innerhalb der Schleife versuche ich auf die Unterelemente eines Items zu zugreifen. Komischerweise steht nach dem Aufruf von
Code:
prodItem.ShortDescription = nodeIter.Current.Value;
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 13:59
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:
while (nodeIter.MoveNext()) {
   var nodeProduct = nodeIter.Current.Select("shortdescription");
   nodeProduct.MoveNext();
   Console.WriteLine(nodeProduct.Current.Value);
   [...]
PS: XPath ist quasi schon wieder out, lang lebe XLinq . Aber da .Net 3.5 für euch wahrscheinlich ein no-go sein dürfte, dürfte XPath wirklich noch das Erträglichste sein.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 14:24
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);              
            }
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 16:10
Die Eigenschaft nicht mit "nodeIter" sondern mit "productNode" befüllen . Hatte es in meinem Code (WriteLine) korrigiert, aber vergessen, nochmal explizit darauf hinzuweisen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 20:59
Jetzt sehe ich es auch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 22:07
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.
Sascha
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 22:11
Zitat von Sascha L:
Was für eine "Komponente" verwendest du?
Keine. Ist ein .NE Projekt und ich benutze die enthaltene XML-Assemby.


Geht mich ja nichts an, aber "MoveNext" ist absolut unschön und fehlerträchtig. Überhaupt das durchgehen durch den XML-Baum.

Zitat:
Ich würde komplett auf XPATH setzen.
Das tue ich. Ist alles XPath.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 23:06
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:
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);
               
            }
da ich den Code selbst getestst habe, sind im Code einige Dinge, die ich dafür benötigt habe (textbox1, usw.)
Sascha
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 23:18
Werde ich mir am Dienstag an der Arbeit mal etwas genauer angucken. Danke für den Hinweis.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Sascha L

Registriert seit: 4. Jun 2004
Ort: Hamm
390 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Mit XPath Knoten auswählen liefert alle Knotenwerte

  Alt 9. Mai 2008, 23:20
Zitat von Luckie:
Werde ich mir am Dienstag an der Arbeit mal etwas genauer angucken. Danke für den Hinweis.
Kein Problem

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
Sascha
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf