Проблемы при выборе узла в XML с пространством имен с использованием XPATH

У меня есть следующая строка 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?

- [РЕДАКТИРОВАТЬ]- Полная строка, где я пытаюсь прочитать узел:

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

Решение

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

Другие вопросы по тегам