我有以下 XPATH 行:
//det[@nItem="1"]/prod/cProd
使用以下命令成功选择所需的节点XPath 可视化工具 http://xpathvisualizer.codeplex.com/,它会自动识别命名空间,您可以定义要选择的命名空间。
当我使用以下 XPATH 代码在 C# 中指定命名空间时:
"http://www.portalfiscal.inf.br/nfe//det[@nItem=\"1\"]/prod/cProd"
它给了我一个 XPathException:
未处理的类型异常
'System.Xml.XPath.XPathException'
发生在 System.Xml.dll 中
信息:
'http://www.portalfiscal.inf.br/nfe//det[@nItem= http://www.portalfiscal.inf.br/nfe//det%5B@nItem=“1”]/prod/cProd'
具有无效的限定名称。
(正如你所看到的,它不是任何转义字符或任何东西,因为它给了我我在异常中试图达到的目标)
如果我知道 XPath 的命名空间,如何正确选择此节点?
- [编辑] -
我尝试读取节点的完整行:
doc.XPathSelectElement("http://www.portalfiscal.inf.br/nfe//det[@nItem=\"1\"]/prod/cProd").Value;
并且删除了不必要的内容的 XML:
<?xml version="1.0" encoding="utf-8"?>
<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10">
<idLote>1</idLote>
<NFe>
<infNFe versao="1.10" Id="NFe31100118583682000178550010000077778397333128">
<det nItem="1">
<prod>
<cProd>111</cProd>
</prod>
</det>
</infNFe>
</NFe>
</enviNFe>
(删掉不必要的东西应该不是问题,因为 XPath Visualizer 为我带来了完全没有问题的节点)
由于您既没有向我们展示 XML 文档,也没有向我们展示您拥有的 C# 代码,所以我只能猜测您在做什么......
好的,看来您正在使用 Linq-to-XML,因此请在此处使用以下代码片段:
// Create and load XML reader
XmlReader reader = XmlReader.Create(new FileStream(@"D.\test.xml", FileAccess.Read));
// get the root element
XElement root = XElement.Load(reader);
// create instance of XML namespace manager
XmlNamespaceManager nsmgr = new XmlNamespaceManager(reader.NameTable);
// add your namespace to the manager and give it a prefix
nsmgr.AddNamespace("ns", "http://www.portalfiscal.inf.br/nfe");
XElement node = root.XPathSelectElement("//ns:det[@nItem="1"]/ns:prod/ns:cProd", nsmgr);
.......
沿着这些思路。基本上,您必须创建某种类型的 XML 命名空间,为其指定一个前缀,然后在 XPath 表达式中使用该前缀(不是整个命名空间),只需使用该前缀。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)