как мы имеем дело с незнанием префикса / пространства имен? - PullRequest
0 голосов

Как перебрать определенный xpath для XmlDocument, у которого нет префикса / пространства имен ?

Я анализирую XML следующим образом:

        var doc = new XmlDocument();
        doc.LoadXml(input);
        var nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace(nsPrefix, ns);
        var nodes = doc.SelectNodes(xpath, nsmgr);

Это прекрасно работает, когда передаются nsPrefix, а также ns и непустые .

Однако, когда пространство имен / префикс пусты, например, вэтот сценарий:

enter image description here

Тогда я не могу правильно проанализировать XML.

Полная функция:

public static class XPathWalker
    {
        public static IEnumerable<string> GetListOfAttachments(string input, string xpath, string nsPrefix, string ns)
        {
            var doc = new XmlDocument();
            doc.LoadXml(input);
            var nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace(nsPrefix, ns);
            var nodes = doc.SelectNodes(xpath, nsmgr);
            foreach (XmlNode node in nodes)
            {
                if (string.IsNullOrWhiteSpace(node.InnerText))
                {
                    continue;
                }
                yield return node.InnerText;
            }
        }
    }

Как перебрать определенный xpath для XmlDocument, у которого нет префикса / пространства имен ?

1 Ответ

0 голосов

Был действительно способ сделать это с XmlDocument.Во-первых, мне пришлось преобразовать входные данные string в stream:

// convert string to stream
byte[] byteArray = Encoding.UTF8.GetBytes(input);
MemoryStream stream = new MemoryStream(byteArray); 

После того, как у меня был stream, я смог передать его в XmlDocument.Вот полный код:

        string input = @"<?xml version="1.0" encoding="UTF-8"?>etc..";
        byte[] byteArray = Encoding.UTF8.GetBytes(input);
        var stream = new MemoryStream(byteArray);
        var doc = new XmlDocument();
        var nodes = doc.SelectNodes(xpath);
        using (var tr = new XmlTextReader(stream))
        {
            tr.Namespaces = false;
            doc.Load(tr);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...