2017-12-19 6 views
1

Ich habe diese xml und wollenC# Xml SelectSingleNode null zurück

<string xmlns="http://www.webserviceX.NET"> 
    <NewDataSet> 
     <Table> 
     <Country>Hong Kong</Country> 
     <City>Cheung Chau</City> 
     </Table> 
     <Table> 
     <Country>Hong Kong</Country> 
     <City>Hong Kong Inter-National Airport</City> 
     </Table> 
    </NewDataSet> 
</string> 

hier ist das erste Land, aus dem XML zu extrahieren, was ich tat:

value = xml.DocumentElement.SelectSingleNode("string/NewDataSet/Table[1]/Country").InnerText; 

Diese immer eine Ausnahme nicht gesetzt werfen Eine Instanz des Objekts als selectsinglenode wird immer null zurückgegeben. Seltsame Sache ist, dass ich diesen xpath bereits unter Verwendung this geprüft habe und es mir den Knoten zurückgebe, den ich will.

Ich habe eine Lösung zu finden gegoogelt und gefunden this darauf hindeutet, dass ich Namespace hinzufügen müssen, hier ist was ich getan habe:

var nsmgr = new XmlNamespaceManager(xml.NameTable); 
    nsmgr.AddNamespace("string", "http://www.webserviceX.NET"); 
    var node = xml.DocumentElement.SelectSingleNode("string/NewDataSet/Table[1]/Country", nsmgr); 

Noch habe ich die gleiche Ausnahme. Kann mir bitte jemand sagen, was ich hier falsch mache? Thanks :)

+1

In dieser Antwort habe dich vermisst, dass der Namespace zu einem Knoten hinzugefügt wird, indem sie auf die nodename mit einem Doppelpunkt vorangestellt wird. Wie Sie Ihren Namespace 'string' benannt haben, müssen Sie alle Nodenamen mit' string: 'voranstellen, damit Sie' string: string \ string: NewDataSet \ ... 'usw. erhalten. – rene

+0

Ihr Wurzelknoten hat ein [Standard-XML Namespace] (https://en.wikipedia.org/wiki/XML_namespace), siehe [XmlDocument.SelectSingleNode- und xmlNamespace-Problem] (https://stackoverflow.com/q/4171451/3744182). Aktuelle verwandte Frage: [Wie bekomme ich XML-Tag, das in DataSet1-Tag (C#) ist?] (Https://Stackoverflow.com/q/47829282/3744182) mit verbundenen Geige https://dotnetfiddle.net/I25p6S zeigt, wie zu mach es richtig. – dbc

+0

@rene das sollten '/' nicht \ (Backslash) Zeichen, glaube ich. – dbc

Antwort

0

Verwenden Sie einfach XmlNamespaceManager

XmlNamespaceManager namespaces = new XmlNamespaceManager(xdoc.NameTable); 
namespaces.AddNamespace("sp", "http://www.webserviceX.NET"); 
var nodes = xdoc.DocumentElement.SelectSingleNode("//sp:NewDataSet/sp:Table[1]/sp:Country", namespaces); 
Verwandte Themen