【问题标题】:Force XDocument to not use namespace prefix if namespace is also defined as default如果命名空间也被定义为默认值,则强制 XDocument 不使用命名空间前缀
【发布时间】:2015-12-14 10:45:08
【问题描述】:

我有一个带有和不带命名空间前缀的默认命名空间的 xml 文件。当我生成 xml 输出时,我会为所有 xml 元素添加前缀。由于我使用的是默认命名空间,有没有办法摆脱前缀?

class Program
{
    static void Main(string[] args)
    {
        var xml =
            "<root xmlns='default-namespace' xmlns:key='default-namespace'>" +
            "  <node1></node1>" +
            "  <node2></node2>" +
            "</root>";
        var document = XDocument.Parse(xml);
        var output = document.ToString();
    }
}

输出:

<key:root xmlns="default-namespace" xmlns:key="default-namespace">
  <key:node1></key:node1>
  <key:node2></key:node2>
</key:root>

我的期望:

<root xmlns="default-namespace" xmlns:key="default-namespace">
  <node1></node1>
  <node2></node2>
</root>

很遗憾,我无法删除重复的命名空间声明。我使用的实际xml文件是由另一方提供的,我需要做的修改尽可能少。

【问题讨论】:

  • 在我看来,不存储节点名称的前缀是 LINQ to XML 对象模型的一个缺点,因此序列化程序在将树序列化为时必须根据命名空间声明属性选择前缀一串 XML。似乎 ToString() 或 Save 的当前实现使用命名空间的最后找到的命名空间声明,因为将顺序更改为 &lt;root xmlns:key='default-namespace' xmlns='default-namespace'&gt; 会产生不同的结果,但这显然不是可以依赖的。如果前缀很重要,请选择不同的树模型,例如 XmlDocument。

标签: c# xml namespaces linq-to-xml


【解决方案1】:

您可以使用 String.Replace 方法获取所需的 XML 格式...

var xml ="<root xmlns='default-namespace' xmlns:key='default-namespace'>" +
         "  <node1></node1>" +
         "  <node2></node2>" +
         "</root>";
        var document = XDocument.Parse(xml);

        var output = document.ToString().Replace("key:", string.Empty);

【讨论】:

  • 这被认为是黑客攻击。如果节点 1 包含值 key:something
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2011-02-21
  • 1970-01-01
相关资源
最近更新 更多