Чтение xml ниже показывает ошибку в c # - PullRequest
1 голос
/ 19 декабря 2011
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
    <w:body>
      <w:customXml w:uri="Sample" w:element="note">
        <w:p w:rsidR="00B06944" w:rsidRDefault="0051608D" w:rsidP="000E0B9F">
          <w:customXml w:element="to">
            <w:r w:rsidR="000E0B9F" w:rsidRPr="00B84BAE">
              <w:rPr>
                <w:b/>
                <w:bCs/>
              </w:rPr>
              <w:t xml:space="preserve">Saran </w:t>
            </w:r>
          </w:customXml>
        </w:body>
     </w:document>

так как я хочу прочитать узел , для этого я пишу следующий код

XmlDocument doc = new XmlDocument();
doc.Load("\\document.xml");
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable);
XmlNode node = doc.SelectSingleNode("/w:body/w:customXml/w:r", namespaceManager);

, который дает:

Показанная ошибкав этой строке необходим менеджер пространства имен или XsltContext.Этот запрос имеет префикс, переменную или пользовательскую функцию.

Как я могу прочитать Xml

Ответы [ 3 ]

4 голосов
/ 19 декабря 2011

Вам необходимо сообщить namespaceManager о значении псевдонима w.Это звучит , как будто это избыточно (из файла), но это не тот случай , что псевдонимы, которые вы хотите для запроса, обязательно из псевдонимов источника,поскольку значение файла идентично, если я заменю все псевдонимы w в исходном документе на foo (при условии, что я также определю foo:xmlns на то же самое).Или я мог бы использовать xmlns вместо псевдонимов повсюду.

Следовательно:

XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable);
namespaceManager.Add("w",
    "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
XmlNode node = doc.SelectSingleNode("/w:body/w:customXml/w:r", namespaceManager);

Это позволяет вашему запросу выполняться одинаково, независимо от конкретных псевдонимов, используемых в источнике.

4 голосов
/ 19 декабря 2011

Это не дает мне этой ошибки - это дает мне ошибку, потому что тег <w:p> не имеет закрывающего тега, как и внешний <w:customXml>. Как только они исправлены, документ правильно загружает .

Тогда возникает вопрос получения правильного запроса. Марк ответил на это в своем ответе, но лично я бы вместо этого использовал методы из LINQ to XML:

var doc = XDocument.Load("test.xml");
XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
var element = doc.Root.Element(w + "body")
                      .Element(w + "customXml")
                      .Element(w + "p")
                      .Element(w + "customXml")
                      .Element(w + "r");

Это находит элемент правильно. Обратите внимание, что это не то же самое, что ваш оригинальный XPath, даже если не считать пространства имен - внимательно посмотрите на свой XML; внутри элемента external <w:customXml> нет элемента <w:r>.

1 голос
/ 19 декабря 2011

Ваш xml недействителен. у вас нет закрывающего тега w: p ...

...