Почему SelectSingleNode возвращает ноль?
-
03-07-2019 - |
Вопрос
Я работаю с XML-документом, который содержит структуру, похожую на эту:
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
.
.
.
</event>
</Events>
</MT>
В настоящее время я загружаю это из файла в XML-документ следующим образом:
XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml"); //Successfully loads btw
Однако у меня возникла проблема, и только с этим конкретным документом, когда я пытаюсь запустить следующую строку кода:
xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null
На правильном ли я пути, предполагая, что это возвращает значение null из-за проблемы с использованием атрибута с именем «id», или я что-то упускаю в коде?
Решение
Я не могу воспроизвести это, используя файл XML
<MT>
<Events>
<event id="1">
<field name="blah" value="a_value" type="atype" />
</event>
</Events>
</MT>
И код
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");
XmlNode node = doc.SelectSingleNode("//event[@id='1']");
Это возвращает ненулевой узел, как и ожидалось.
Обновлять
После добавления xmlns="example.org"
к <MT>
элемент, мне пришлось настроить менеджер пространства имен для XPath и использовать пространство имен для события.По какой-то причине не удалось заставить работать пространство имен по умолчанию.
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);
Одна вещь смутила меня, когда я пытался заставить это работать.Зачем XmlNamespaceManager нужен XmlNameTable из документа, если не для того, чтобы выяснить, какие пространства имен он содержит?Например, зачем мне определять NameTable и пространство имен?Буду признателен, если кто-нибудь из знающих оставит небольшой комментарий.