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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top