我有以下XPATH行:
// DET [@ nItem域= “1”] / PROD / cProd
使用XPath Visualizer成功选择所需节点,然后自动识别名称空间,并定义要选择的名称空间。
当我使用以下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= “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给我带来了没有任何问题的节点)
答案 0 :(得分:5)
既然你没有向我们展示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表达式中使用该前缀 - 而不是整个命名空间 - 只是前缀。