Perché SelectSingleNode restituisce null?
-
03-07-2019 - |
Domanda
Sto lavorando con un documento XML che contiene una struttura che assomiglia a questa:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
Attualmente sto caricando questo da un file in un documento XML in questo modo:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
Tuttavia sto riscontrando un problema e solo con questo particolare documento quando provo a eseguire la riga di codice successiva:
xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null
Sono sulla strada giusta supponendo che questo stia restituendo null a causa di un problema con l'utilizzo di un attributo chiamato 'id' o mi sto perdendo qualcosa nel codice?
Soluzione
Non posso replicarlo usando un file XML
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
</event>
</Events>
</MT>
E codice
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");
XmlNode node = doc.SelectSingleNode("//event[@id='1']");
Questo restituisce un nodo non nullo come previsto.
Aggiorna
Dopo aver aggiunto un xmlns="example.org"
all'elemento <MT>
, ho dovuto configurare un gestore dello spazio dei nomi per XPath e usare lo spazio dei nomi per l'evento. Impossibile ottenere lo spazio dei nomi predefinito per qualche motivo.
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);
Una cosa mi ha confuso quando ho cercato di farlo funzionare. Perché XmlNamespaceManager ha bisogno di XmlNameTable dal documento se non per scoprire quali spazi dei nomi contiene? Come in, perché devo definire la NameTable e lo spazio dei nomi? Gradirei se qualcuno che lo sapesse potesse lasciare un breve commento.