解析 XFDL 内容 - C#
本文关键字:内容 XFDL 解析 | 更新日期: 2023-09-27 18:25:32
我的任务是从XFDL文件中翻录和剥离相关数据。我正在尝试使用 XmlDocument 的 SelectSignleNode 方法来执行此操作。然而,它已被证明是不成功的。
Represntative 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);
Yields me System.NullReferenceException as a XmlNode 未被选中。
我想我遇到了 xpath 问题,但我似乎无法理解在哪里。可以使用以下方法轻松选择较早的 xml 节点:
XmlNode checkBox = document.SelectSingleNode("//page1/check3");
MsgBox(checkBox.InnerText);
显示就好了。只是为了在传球时阻止它,<page1>
标签中没有<check9></check9>
的定义。
有人有见识吗?
提前谢谢。
好的,这就是交易。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