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