使用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.
}
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']