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