SelectSingleNode



  • Hallo!

    Habe noch ein kleines Problem mit einer XML-Datei.
    Die XML-Datei sieht folgendermaßen aus:

    <?xml version="1.0" encoding="utf-8" ?> 
    - <Film xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    - <Filmliste>
    - <Kontakt FilmId="10">
    - <Film>
      <Filmautor>Alfred Hitchcock</Filmautor> 
      <Filmname>Psycho</Filmname> 
      <Filmlaenge>200 min</Filmlaenge> 
      </Film>
      </Kontakt>
    - <Kontakt FilmId="11">
    - <Film>
      <Filmautor>Ingmar Bergmann</Filmautor> 
      <Filmname>Das Schweigen</Filmname> 
      <Filmlaenge>80 min</Filmlaenge> 
      </Film>
      </Kontakt>
      </Filmliste>
      </Film>
    

    Die Abrage nach einem Knoten sieht folgend aus:

    //Objekt der Klasse XmlDocument erstellen
    xmldokument = gcnew XmlDocument();
    //Load Methode erstellt die Struktur im Speicher da wodurch navigiert werden kann
    xmldokument->Load(Xmleser);
    //Knoten durchlaufen
    XmlNode^ xmle2 = xmldokument->SelectSingleNode("descendant::Filmliste/Kontakt[@FilmId='10']");
    if (xmle2->HasChildNodes)
    {
    // Code ausführen
    }
    

    Nun möchte ich aber gerne über ein Eingabefeld die FilmId eingeben und es soll dan die entsprechenden Daten auf dem Monitor angezeigt werden. Da ist nun das Problem: Wie sieht die Syntax aus damit [@FilmId='variable'] ist. Ich such schon seit zwei Tagen nach einer Lösung und finde die nicht.

    MfG
    Hotte



  • Du kannst dein XPath Query zuerst zusammensetzen und dann anwenden.

    z.B.

    int filmId = 10;
    String^ xPath = String::Format(L"descendant::Filmliste/Kontakt[@FilmId='{0}']", filmId);
    XmlNode^ xmle2 = xmldokument->SelectSingleNode(xPath);
    


  • Danke klappt super.

    Wenn du mir noch mal helfen kannst wäre super.
    Ich möchte über einen Button mein XML Dokument durchlaufen und in jedem Kontakt eine neue Eigenschaft hinzu fügen. Das Problem ist nur, dass er zwar die XML Datei durchläuft und mit

    MessageBox::Show(xmle2->InnerText->ToString());
    

    immer die richtigen Werte des Knotens ausgibt, doch er fügt immer nach dem letzten Knoten die neue Eigenschaft ein und nicht bei jedem Element.

    So sollte die neue XML-Datei aussehen

    <?xml version="1.0" encoding="utf-8" ?>
    - <Film xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    - <Filmliste>
    - <Kontakt FilmId="10">
    - <Film>
      <Filmautor>Alfred Hitchcock</Filmautor>
      <Filmname>Psycho</Filmname>
      <Filmlaenge>200 min</Filmlaenge>
      <Filmbewertung>3 </Filmbewertung>
      </Film>
      </Kontakt>
    - <Kontakt FilmId="11">
    - <Film>
      <Filmautor>Ingmar Bergmann</Filmautor>
      <Filmname>Das Schweigen</Filmname>
      <Filmlaenge>80 min</Filmlaenge>
      <Filmbewertung>4 </Filmbewertung>
      </Film>
      </Kontakt>
      </Filmliste>
      </Film>
    

    Code:

    String^ xPath = String::Format(L"descendant::Filmliste/Kontakt[@FilmId='{0}']", filmId);
    XmlNode^ xmle2 = xmldokument->SelectSingleNode(xPath);
    if (xmle2->HasChildNodes)
    {
      xmle2->AppendChild(root2); // In root2 ist der neue Knoten mit Wert 
     MessageBox::Show(xmle2->InnerText->ToString()); //zeigt immer den richtigen Knoten
    }
    

    MfG
    Hotte


Anmelden zum Antworten