6 Stimmen

Warum gibt SelectSingleNode null zurück?

Ich arbeite mit einem XML-Dokument, das eine Struktur enthält, die ähnlich aussieht wie diese:

<MT>
  <Events>
    <event id="1">
      <field name="blah" value="a_value" type="atype" />
      .
      .
      .
     </event>
   </Events>
 </MT>

Ich lade diese Daten derzeit auf diese Weise aus einer Datei in ein XML-Dokument:

XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml");  //Successfully loads btw

Ich stoße jedoch auf ein Problem, und zwar nur bei diesem einen bestimmten Dokument, wenn ich versuche, die nächste Codezeile auszuführen:

xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null 

Bin ich auf dem richtigen Weg, indem ich vermute, dass dies null zurückgibt, weil ein Problem mit der Verwendung eines Attributs namens "id" oder bin ich etwas in Code fehlt?

10voto

Mikko Rantanen Punkte 7707

Ich kann dies nicht mit einer XML-Datei reproduzieren

<MT>
  <Events>
    <event id="1">
      <field name="blah" value="a_value" type="atype" />
     </event>
   </Events>
</MT>

Und Code

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");

XmlNode node = doc.SelectSingleNode("//event[@id='1']");

Dies gibt erwartungsgemäß einen Nicht-Null-Knoten zurück.

更新情報

Nach dem Hinzufügen einer xmlns="example.org" zum <MT> Element, musste ich einen Namespace-Manager für den XPath konfigurieren und den Namespace für das Ereignis verwenden. Ich konnte den Standard-Namensraum aus irgendeinem Grund nicht zum Laufen bringen.

XmlDocument doc = new XmlDocument();
doc.Load(@"D:\test.xml");

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("e", "http://example.org");

XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager);

Eine Sache verwirrte mich, als ich versuchte, dies zum Laufen zu bringen. Warum benötigt der XmlNamespaceManager die XmlNameTable des Dokuments, wenn nicht, um herauszufinden, welche Namespaces es enthält? Warum muss ich also die NameTable definieren? y den Namensraum? Ich wäre dankbar, wenn jemand, der es weiß, einen kurzen Kommentar abgeben könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X