2015-12-02 59 views
0

我负责翻录和剥离XFDL文件中的相关数据。我试图使用XmlDocument的SelectSignleNode方法来做到这一点。但是,它被证明是不成功的。解析XFDL内容 - C#

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); 

息率我System.NullReferenceException没有被选中的XMLNode。

我想我有一个xpath的问题,但我似乎无法理解在哪里。较早的xml节点很容易使用:

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

显示正常。并且只是在通行证中出现问题,<page1>标记中没有<check9></check9>的定义。

任何人都有一些见解?

在此先感谢。

+0

是否有可能导致从XPath的多个节点? –

+0

第一个:是的。第二个:号码 我不瘦我缺少一个嵌套的路径,要么。 – mcwagner

+0

通过在IE中打开XML来验证完全枚举的xpath如下:xfdl> page> check> value。我错过了什么? – mcwagner

回答

0

好的,这就是交易。 XFDL定义了一个默认名称空间,它需要一个用于xpath查询的任意映射。在我的情况:

XML:

<XFDL xmlns="http://www.ibm.com/xmlns/prod/xfdl/8.0" ... > 

代码:XFDL:

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>但是以另一种命名空间中定义的问题是复杂的。我的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