Pergunta

Eu estou trabalhando com um documento XML que contém uma estrutura que é semelhante à seguinte:

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

Atualmente estou carregar este a partir de um arquivo em um documento XML desta forma:

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

No entanto, eu estou correndo em um problema e apenas com este documento em particular quando tento executar a próxima linha de código:

xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null 

Am I no caminho certo ao adivinhar que este é o retorno nula devido a um problema com o uso de um atributo chamado 'id' ou estou perdendo algo em código?

Foi útil?

Solução

Eu não pode replicar isso usando um arquivo XML

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

E código

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");

XmlNode node = doc.SelectSingleNode("//event[@id='1']");

Isso retorna um nó não nulo como esperado.

Atualizar

Depois de adicionar um xmlns="example.org" ao elemento <MT>, eu tive que configurar um gerenciador de namespace para o XPath e usar o namespace para o evento. Não foi possível obter o namespace padrão para o trabalho por algum 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);

Uma coisa me confundiu ao tentar chegar a este trabalho. Por que XmlNamespaceManager necessidade XmlNameTable do documento se não para descobrir o que namespaces que ele contém? Como, por que eu preciso para definir o NameTable e do namespace? Eu apreciaria se alguém que sabe poderia cair um breve comentário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top