Разбор содержимого 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

Другие вопросы по тегам