c # Проблема с моим Xpath? Разбор Xml из файла DocX с помощью Package.GetPart - PullRequest
0 голосов
/ 30 октября 2018

У меня есть класс с именем Reader

public class Reader

Вот конструктор

public Reader(string fileName)
        {
            using (Package package = Package.Open(AppDomain.CurrentDomain.BaseDirectory + "\\" + fileName + ".docx"))
            {
                Document = new XmlDocument();
                Document.Load(package.GetPart(new Uri("/word/document.xml", UriKind.Relative)).GetStream());
                xmlNamespaceManager = new XmlNamespaceManager(Document.NameTable);
                xmlNamespaceManager.AddNamespace("w", @"http://schemas.microsoft.com/office/word/2006/wordml");
            }
        }

Существует также открытый метод ReadTextNodes, который я настроил для тестирования.

public void ReadTextNodes()
        {
            var nodes = Document.SelectNodes("//w:t", xmlNamespaceManager);
            Console.WriteLine(nodes.Count);
            foreach (XmlNode node in nodes)
            {
                Console.WriteLine(node.InnerText);
            }
        }

Я использовал Xpath "// w: t" - я связал это с пространством имен XML "w", используемым Word ("http://schemas.microsoft.com/office/word/2006/wordml") Тем не менее, этот запрос дает мне ноль узлов. Когда я заменяю на «// *», консоль очень быстро заполняется текстом. Так что не так с первым запросом?

1 Ответ

0 голосов
/ 30 октября 2018

Я понял, что использую неправильную схему. Я сохранил файл docx как файл XML и открыл в Visual Studio, чтобы обнаружить, что «w» на самом деле сопоставлено с «http://schemas.openxmlformats.org/wordprocessingml/2006/main"

»

А не до "http://schemas.microsoft.com/office/word/2006/wordml"

...