XmlNodeList (perché è questo vuoto)
-
22-09-2019 - |
Domanda
Non riesco a capire perché questo NodeList è Vuoto
XmlDocument document = new XmlDocument();
document.Load(xmlpath);
XmlNodeList nodes = document.SelectNodes("/StructureResponse/rootItem/attributes/Attribute");
Qui il XMLFILE
<?xml version="1.0" encoding="utf-8"?>
<StructureResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://nts-de-osm1-pxc/webservices/">
<consolidatedItems xsi:nil="true" xmlns="http://systinet.com/wsdl/com/osm/webservices/service/" />
<rootItem xsi:type="Part" xmlns="http://systinet.com/wsdl/com/osm/webservices/service/">
<attributes>
<Attribute>
<dataDictionary xsi:nil="true" />
<dataType>string</dataType>
<displayName>IDENT_NR</displayName>
<key>true</key><name>IDENT_NR</name>
<searchable>true</searchable>
<userAttribute>true</userAttribute>
<value>9662744</value>
</Attribute>
<Attribute>
<dataDictionary xsi:nil="true" />
<dataType>string</dataType>
<displayName>AI</displayName>
<key>true</key><name>AI</name>
<searchable>true</searchable>
<userAttribute>true</userAttribute>
<value>00</value>
</Attribute>
</rootItem>
</StructureResponse>
Nel copione finale voglio ottenere una stringa di matrice che contiene tutti gli attributi in esso.
Grazie Stefan
Soluzione
La risposta di marc_s utente è in realtà corretto. È necessario prestare attenzione ai namespace XML. Il suo esempio di codice, tuttavia, non lavorerà direttamente per il vostro esempio. Ecco un esempio completo che funziona con l'XML hai dato (anche se ho dovuto pulirlo ... mancava un tag di chiusura per attributes
).
string xmlData =
@"<?xml version='1.0' encoding='utf-8'?>
<StructureResponse
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns='http://nts-de-osm1-pxc/webservices/'>
<consolidatedItems xsi:nil='true' xmlns='http://systinet.com/wsdl/com/osm/webservices/service/' />
<rootItem xsi:type='Part' xmlns='http://systinet.com/wsdl/com/osm/webservices/service/'>
<attributes>
<Attribute>
<dataDictionary xsi:nil='true' />
<dataType>string</dataType>
<displayName>IDENT_NR</displayName>
<key>true</key>
<name>IDENT_NR</name>
<searchable>true</searchable>
<userAttribute>true</userAttribute>
<value>9662744</value>
</Attribute>
<Attribute>
<dataDictionary xsi:nil='true' />
<dataType>string</dataType>
<displayName>AI</displayName>
<key>true</key>
<name>AI</name>
<searchable>true</searchable>
<userAttribute>true</userAttribute>
<value>00</value>
</Attribute>
</attributes>
</rootItem>
</StructureResponse>";
XmlDocument document = new XmlDocument();
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(document.NameTable);
namespaceManager.AddNamespace("a", "http://nts-de-osm1-pxc/webservices/");
namespaceManager.AddNamespace("b", "http://systinet.com/wsdl/com/osm/webservices/service/");
document.LoadXml(xmlData);
XmlNodeList nodes = document.SelectNodes("/a:StructureResponse/b:rootItem/b:attributes/b:Attribute", namespaceManager);
// 'nodes' contains 2 items now, as expected
Io suggerisco di fare un po 'di più lo studio di namespace XML. Prova scrematura di Ronald Bourret "namespace XML FAQ" .
Altri suggerimenti
Non stai tenendo conto del namespace XML (xmlns="http://nts-de-osm1-pxc/webservices/"
) sul documento!
OK, si hanno anche due spazi separati - aggiornato il mio campione
.Prova questo:
XmlDocument document = new XmlDocument();
document.Load(xmlpath);
XmlNamespaceManager mgr = new XmlNamespaceManager(document.NameTable);
mgr.AddNamespace("ns", "http://nts-de-osm1-pxc/webservices/");
mgr.AddNamespace("root", "http://systinet.com/wsdl/com/osm/webservices/service/");
XmlNodeList nodes = document.SelectNodes("/ns:StructureResponse/root:rootItem/root:attributes/root:Attribute", mgr);
Marc
Prova:
XmlNodeList nodes = document.SelectNodes("./StructureResponse/rootItem/attributes");