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

时间:2010-04-09 12:56:01

标签: c# .net xml xpath namespaces

我有以下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给我带来了没有任何问题的节点)

1 个答案:

答案 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表达式中使用该前缀 - 而不是整个命名空间 - 只是前缀。