【问题标题】:how do we deal with not knowing the prefix/namespace?我们如何处理不知道前缀/命名空间的问题?
【发布时间】:2019-05-30 15:42:44
【问题描述】:

如何针对没有前缀/命名空间的XmlDocument 遍历特定的 xpath

我正在像这样解析 XML:

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

nsPrefixns 被传入并且非空时,这完全正常。

但是,例如在这种情况下,当命名空间/前缀为空时:

然后我无法正确解析 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;
            }
        }
    }

如何针对没有前缀/命名空间的 XmlDocument 迭代特定 xpath

【问题讨论】:

  • 如果你根本不关心命名空间,而是想使用System.Xml.Linq,你可以use LocalName
  • @Crowcoder 谢谢!但这意味着我将重新实现。有创可贴解决方案吗?
  • @BrootsWaymb "可能" 不付账单,你是说使用 xmldocument 不可能 忽略命名空间?
  • 我真的不知道,很久没用XmlDocument了。

标签: c# .net xml xpath xsd


【解决方案1】:

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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多