2009-04-30 9 views
5

Ich bin mit einem XML-Dokument arbeiten, die eine Struktur enthält, die diesen recht ähnlich sieht:Warum gibt SelectSingleNode null zurück?

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

ich derzeit diese aus einer Datei in ein XML-Dokument auf diese Weise bin Laden:

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

jedoch habe ich in ein Problem laufen lasse und nur mit diesem einen bestimmten Dokument, wenn ich versuche, die nächste Codezeile auszuführen:

bin ich auf der Bohrinsel ht track, indem ich rate, dass dies null zurückgibt wegen eines Problems mit einem Attribut mit dem Namen "id" oder fehlt mir etwas im Code?

Antwort

9

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 einem xmlns="example.org", um das <MT> Element hinzugefügt wird, hatte ich einen Namespace-Manager für die XPath zu konfigurieren und den Namespace für das Ereignis verwenden. Der Standard-Namespace konnte aus irgendeinem Grund nicht verwendet werden.

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 benötigt XmlNamespaceManager XmlNameTable aus dem Dokument, wenn Sie nicht herausfinden wollen, welche Namespaces es enthält? Wie in, warum muss ich die NameTable und den Namespace definieren? Ich würde mich freuen, wenn jemand, der es weiß, einen kurzen Kommentar abgeben könnte.

+0

Beantworten meiner eigenen Frage. XmlNameTable wird zum Optimieren von Zeichenfolgenvergleichen verwendet und ich nehme an, dass der Grund, warum Sie dem XmlNamespaceManager eine vorhandene Namenstabelle geben können, schnelle Vergleiche mit den XmlDocument-Elementen ermöglicht, da diese dann die NameTable teilen. –

+0

Ihr Update scheint sinnvoll zu sein. Ich habe versucht, eine abgekürzte Form des XML zu erstellen, und vergessen, den Namespace zu veröffentlichen. Danke, dass Sie sich die zusätzliche Zeit genommen haben, um diese herauszufinden. Sobald ich den Namespace aus dem ursprünglichen XML entfernt habe, funktioniert alles wie es sollte. Auf jeden Fall lohnt mehr Studium des System.Xml-Namespace. –