0

我的任务是从 XFDL 文件中提取和剥离相关数据。我正在尝试使用 XmlDocument 的 SelectSignleNode 方法来执行此操作。然而,事实证明它并不成功。

代表 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>标签中没有定义。

有人有一些见识吗?

提前致谢。

4

1 回答 1

0

好的,这就是交易。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

于 2015-12-03T18:27:56.653 回答