C# XML Knoten finden per XPath



  • Hallo,

    ich habe ein kleines Problem. Ich möchte in einer XML-Datei einen Knoten mit der Methode SelectSingleNode finden.
    Dazu will ich einen XPath Ausdruck verwenden, nur leider bin ich ziemlich erfolglos.

    ZUnächst einmal ein Ausschnitt aus der XMl-Datei:

    <?xml version="1.0" standalone="yes"?>
    <scan_data xmlns="http://tempuri.org/scan_data.xsd" >
      <assets>
        <inv_nr>item 0</inv_nr>
        <bez>item 0</bez>
        <std_code>0000</std_code>
        <std_bez>item 0</std_bez>
        <kst>item 0</kst>
      </assets>
      <assets>
        <inv_nr>item 1</inv_nr>
        <bez>item 1</bez>
        <std_code>0001</std_code>
        <std_bez>item 1</std_bez>
        <kst>item 1</kst>
      </assets>
    </scan_data>
    

    Und hier mein Xpath-Ausdruck:

    string xPathExpression = "/scan_data/assets[inv_nr='item 0']";
    

    Ich möchte also den Knoten haben, wo inv_nr meinen Kriterien entspricht.
    Leider liefert mir ein

    XmlElement node= (XmlElement)xmlfile.SelectSingleNode( xPathExpression );
    

    immer null. Er wird also nicht gefunden.
    Liegt es am xmlns="http://tempuri.org/scan_data.xsd" in der XML-Datei?



  • Marco79 schrieb:

    Liegt es am xmlns="http://tempuri.org/scan_data.xsd" in der XML-Datei?

    Wenn du das weglässt geht es.



  • Ja richtig.
    Nur leider erzeuge ich die Datei nicht und muss sie so nehmen wie sie kommt.



  • Du kannst den Namespace auch hinzufügen:

    XmlNamespaceManager namespaceManager = new XmlNamespaceManager (xmldoc.NameTable);
    namespaceManager.AddNamespace("","http://tempuri.org/scan_data.xsd");
    
    XmlNode node = xmldoc.SelectSingleNode("/scan_data/assets[inv_nr='item 0']");
    

    Zumindest so in etwa, ist jetzt aus dem Kopf. Einfach mal die Doku dazu befragen. 🙂



  • Ok vielen Dank, so klappt es:

    XmlNamespaceManager nsp = new XmlNamespaceManager( xmldoc.NameTable );
     nsp.AddNamespace( "ns", "http://tempuri.org/scan_data.xsd" );
    
     string xPathExpression = "/ns:scan_data/ns:assets[ns:inv_nr='item 0']";
     XmlElement node = (XmlElement)xmldoc.SelectSingleNode( xPathExpression, nsp );
    

    Man muss also den Namespacepräfix mit in den String aufnehmen.
    Thema kann geschlossen werden 😉


Anmelden zum Antworten