使用XPath按名称属性值查找节点

时间:2011-11-15 17:15:49

标签: c# .net xml xpath

我试图通过name属性值找到一个节点。

以下是xml文档的示例:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE kfx:XMLRELEASE SYSTEM "K000A004.dtd">
<kfx:XMLRELEASE xmlns:kfx="http://www.kofax.com/dtd/">
  <kfx:KOFAXXML>
    <kfx:BATCHCLASS ID="00000008" NAME="CertficateOfLiability">
      <kfx:DOCUMENTS>
        <kfx:DOCUMENT DOCID="00000006" DOCUMENTCLASSNAME="COL">
          <kfx:DOCUMENTDATA>
            <kfx:DOCUMENTFIELD NAME="Producer Name" VALUE="Howalt+McDowell Insurance" />
           ...
           ....

这是我的尝试表达:

 var xml = XDocument.Load(new StreamReader("C:\\Users\\Matthew_cox\\Documents\\test.xml"));
 XNamespace ns = "http://www.kofax.com/dtd/";
 XmlNamespaceManager nsm = new XmlNamespaceManager(xml.CreateNavigator().NameTable);
 nsm.AddNamespace("kfx", ns.NamespaceName);

 var docs = xml.Descendants(ns + "DOCUMENT");
 foreach(var doc in docs)
 {
      doc.XPathSelectElement("/DOCUMENTDATA/DOCUMENTFIELD/[@name='Producer Name']", nsm); //this line produces this exception: Expression must evaluate to a node-set.
 }

2 个答案:

答案 0 :(得分:1)

XML区分大小写。提供的XML kfx:DOCUMENTFIELD具有NAME属性。您的XPath也没有引用命名空间。

试试这个XPath:

kfx:DOCUMENTDATA/kfx:DOCUMENTFIELD[@NAME = 'Producer Name']

答案 1 :(得分:1)

我发现有两件事是错误的。

首先,您选择以“/”开头,从文档根目录中选择,因此删除前导斜杠。

其次表达有点奇怪。我会将条件直接包含在DOCUMENTFIELD中。 (我不确定节点轴上的表达式是否实际上意味着什么。就像在... / [..]等效于... / node()[..]或者甚至...... / * [.. ])

正如Kirill所说,您还应该观察大小写和名称空间,但这应该解决c#抱怨不评估节点集的表达式:

kfx:DOCUMENTDATA/kfx:DOCUMENTFIELD[@NAME = 'Producer Name']