使用XPATH使用命名空间选择XML中的节点时出现的问题

Mar*_*elo 1 .net c# xml xpath namespaces

我有以下XPATH行:

// DET [@ nItem域= "1"]/PROD/cProd

这成功地使用XPath Visualizer选择了所需的节点,它自动识别命名空间,并定义要选择的命名空间.

当我使用以下XPATH代码在C#中指定命名空间时:

"http://www.portalfiscal.inf.br/nfe//det[@nItem=\"1\"]/prod/cProd"
Run Code Online (Sandbox Code Playgroud)

它给了我一个XPathException:

System.Xml.dll中发生未处理的"System.Xml.XPath.XPathException"类型异常附加信息:' 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;
Run Code Online (Sandbox Code Playgroud)

并且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>
Run Code Online (Sandbox Code Playgroud)

(不必要的东西不应该是一个问题,因为XPath Visualizer给我带来了完全没有问题的节点)

mar*_*c_s 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);
.......
Run Code Online (Sandbox Code Playgroud)

沿着那条线的东西.您基本上必须创建某种XML命名空间,给它一个前缀,然后在XPath表达式中使用该前缀 - 而不是整个命名空间 - 只是前缀.

  • 除了性能之外,使用`local-name()`还有其他问题.最重要的一个就是它正在做的事情:忽略命名空间.无论何时忽略名称空间,都存在选择位于不同名称空间但恰好具有与您要查找的名称相同的本地名称的节点的风险.那很糟. (2认同)