【问题标题】:Parsing XFDL Contents - C#解析 XFDL 内容 - C#
【发布时间】:2016-03-07 01:58:14
【问题描述】:

我的任务是从 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);

在未选择 XmlNode 时产生 System.NullReferenceException。

我认为我遇到了 xpath 问题,但我似乎无法理解在哪里。使用以下命令可以轻松选择较早的 xml 节点:

XmlNode checkBox = document.SelectSingleNode("//page1/check3");
MsgBox(checkBox.InnerText);

显示很好。只是为了阻止它,&lt;page1&gt; 标签中没有&lt;check9&gt;&lt;/check9&gt; 的定义。

有人有见解吗?

提前致谢。

【问题讨论】:

  • xpath 是否可能产生多个节点?
  • 第一个:是的。第二个:不。我不瘦,我也缺少嵌套路径。
  • 经过验证的全枚举xpath如下:xfdl > page > check > value via opening XML in IE。我错过了什么?
  • 好问题!如果你知道你不会在这里问。 @sid 值是否可能不是真正的大写?当您添加 [@sid] 限定符时,您的元素 xpath 似乎可以正常工作并且事情会中断
  • 在添加限定符时你是对的。我可以使用“GetElementsByTagName”获取“”的所有实例,但不想与“SelectNodes”或“SelectSingleNode”合作。我确实在我的代表性 XML 中省略了 '' 标记中的命名空间。为此,我实例化了 'XmlNamespaceManager' 并添加了所有命名空间并调用了 'SelectSingleNode("xpath", manager)' 没有其他效果......

标签: c# xml xpath xfdl


【解决方案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);

问题变得复杂,因为&lt;check&gt; 被埋在&lt;page&gt; 中,而&lt;page&gt; 定义在另一个命名空间: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

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2021-12-30
    相关资源
    最近更新 更多