【问题标题】:How to extract a node from XmlDocument ignoring default namespace如何从 XmlDocument 中提取节点忽略默认命名空间
【发布时间】:2014-05-08 13:31:16
【问题描述】:

我需要从 XmlDocument 中提取节点的 xml,如果它最初不存在,则没有命名空间属性。 这是 XML 文件:

<app xmlns="http://java.sun.com/xml/ns/j2ee" ...>
  <item/>
</app>

这是我为了得到一个节点所做的:

var document = new new XmlDocument();
document.PreserveWhitespace = true;
document.LoadXml(sourceRootText);
...
var node = GetNode(document);
var text = node.OuterXml;

它返回以下结果:

text = "<item xmlns='http://java.sun.com/xml/ns/j2ee' />";

有没有办法告诉文档不要在节点中包含命名空间? 我明白为什么要添加它,但我想保留它没有命名空间。

另外,很遗憾我不能使用 XDocument,因为很多代码已经使用了 XmlDocument,而且我现在要重新编写它并不容易。

编辑:其实我可以尝试 XDocument 来解析 XmlNode.OuterXml 然后删除命名空间,我现在就试试这个。

【问题讨论】:

    标签: c# xml-namespaces xmldocument


    【解决方案1】:

    我在同样的情况下苦苦挣扎。以下是我应用的解决方案,其中我从所有命名空间中剥离了 xml。也许这会帮助你

    XElement xdoc = stripNS(XElement.Parse(node.NextSibling.OuterXml, LoadOptions.PreserveWhitespace));
                           XmlDocument xmlDoc = new XmlDocument();
                           using (XmlReader xmlReader = xdoc.CreateReader())
                           {
                               xmlDoc.Load(xmlReader);
                           }
    
    static XElement stripNS(XElement root)
               {
                   return new XElement(root.Name.LocalName, root.HasElements ? root.Elements().Select(el => stripNS(el)) : (object)root.Value);
               }
    

    【讨论】:

    • 这将删除所有属性。
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2011-05-23
    • 1970-01-01
    • 2011-12-05
    • 2015-02-18
    相关资源
    最近更新 更多