Warum kehrt SelectSingleNode null?
-
03-07-2019 - |
Frage
Ich arbeite mit einem XML-Dokument, das eine Struktur enthält, die in etwa so aussieht:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
Ich bin Laden zur Zeit dieses aus einer Datei in ein XML-Dokument auf diese Weise:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
Allerdings betreiben ich in ein Problem und nur mit diesem einem 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 durch zu raten, dass dies aufgrund eines Problems null zurückkehrt mit mit einem Attribut mit dem Namen ‚id‘ oder bin ich etwas in Code fehlt?
Lösung
Ich kann nicht replizieren diese eine XML-Datei mit
<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 einen Nicht-Null-Knoten, wie erwartet.
Aktualisieren
Nach einer xmlns="example.org"
zum <MT>
Elemente hinzugefügt wird, hatte ich einen Namespace-Manager für den XPath zu konfigurieren und den Namespace für das Ereignis verwenden. Kann die Standard-Namespace erhält aus irgendeinem Grunde zu arbeiten.
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 verwirrt mich, wenn dies zu umgehen versuchen, zu arbeiten. Warum XmlNamespaceManager braucht XmlNameTable aus dem Dokument, wenn nicht, um herauszufinden, was es enthält Namespaces? Wie in, warum muss ich das Nametable und , um den Namensraum definieren? Ich würde es begrüßen, wenn jemand, der weiß noch einen kurzen Kommentar fallen könnte.