Разбор содержимого XFDL - C#
Мне поручено копировать и извлекать соответствующие данные из файлов XFDL. Я пытаюсь использовать метод SelectSignleNode XmlDocument для этого. Однако это оказалось неудачным.
Репрезентативный XML:
<XFDL>
...
<page1>
<check3>true</check3>
</page1>
...
<page sid="PAGE1">
<check sid="CHECK9">
<value>true</value>
</check>
</page>
...
Код:
XmlDocument document = new XmlDocument();
document.Load(memoryStream);//decoded and unzipped xfdl file
//Doesn't work
XmlNode checkBox = document.SelectSingleNode("//check[@sid='CHECK9']/value");
//Doesn't work
XmlNode checkBox = document.SelectSingleNode("//page[@sid='PAGE1']/check[@sid='CHECK9']");
MsgBox(checkBox.InnerXml);
Дает мне System.NullReferenceException, поскольку XmlNode не выбран.
Я думаю, что у меня проблема с xpath, но я не могу понять, где. Более ранний узел xml легко выбрать с помощью:
XmlNode checkBox = document.SelectSingleNode("//page1/check3");
MsgBox(checkBox.InnerText);
Отображается просто отлично. И просто чтобы избежать этого на перевале, нет определения <check9></check9>
в <page1>
тег.
У кого-нибудь есть понимание?
Заранее спасибо.
1 ответ
Хорошо, вот и сделка. XFDL определяет пространство имен по умолчанию, которое требует произвольного отображения для запросов xpath. В моем случае:
XML:
<XFDL xmlns="http://www.ibm.com/xmlns/prod/xfdl/8.0" ... >
Код:
manager.AddNamespace("a", "http://www.ibm.com/xmlns/prod/xfdl/8.0");
//Append 'a:' to query elements
document.SelectSingleNode("//a:check[@sid='CHECK9']/a:value", manager);
Проблема усугубляется, потому что <check>
похоронен в <page>
который определен в другом пространстве имен: xfdl. Мой запрос xpath становится:
document.SelectSingleNode("//xfdl:page[@sid='PAGE1']/a:check[@sid='CHECK9']/a:value", manager);
Теперь это скорее специфично для XFDL, но может быть применено к другим вопросам, когда в XML-документе определено несколько пространств имен.
РЕДАКТИРОВАТЬ 1 Источник: http://codeclimber.net.nz/archive/2008/01/09/How-to-query-a-XPath-doc-that-has-a-default.aspx