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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top