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

本文关键字:查找 节点 属性 XPath 使用 | 更新日期: 2023-09-27 18:14:58

我正在尝试通过名称属性值查找节点。

下面是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.
 }

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

XML区分大小写。在提供的XML中,kfx:DOCUMENTFIELD具有NAME属性。而且XPath没有对名称空间的引用。

试试这个XPath:

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

我觉得有两件事不对。

首先你选择以"/"开头,这是从文档根目录选择,所以去掉前面的斜杠。

第二,表达式有点奇怪。我将直接在DOCUMENTFIELD中包含条件。(我不确定节点轴上的表达式是否实际上意味着什么。例如……/……/node()[…]/*[..]?)

正如Kirill所指出的,你还应该注意大小写和命名空间,但这应该可以解决c#对表达式不计算到节点集的抱怨:

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