Проблемы при выборе узла в XML с пространством имен с использованием XPATH - PullRequest
1 голос
/ 09 апреля 2010

У меня есть следующая строка XPATH:

// йе [@ nItem = "1"] / прод / cProd

Успешно выбирает нужный узел с помощью XPath Visualizer , где он автоматически идентифицирует пространство имен и определяет, в каком пространстве имен вы хотите выбрать.

Когда я указываю пространство имен в C # со следующим кодом XPATH:

"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?

- [EDIT] - Полная строка, где я пытаюсь прочитать узел:

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 Ответ

5 голосов
/ 09 апреля 2010

Поскольку вы не показываете ни 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, а не все пространство имен, а просто префикс.

...