Por que é SelectSingleNode retornando null?
-
03-07-2019 - |
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?
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.