【问题标题】:Duplicate namespace in XElement (C#)XElement (C#) 中的重复命名空间
【发布时间】:2014-05-10 03:23:12
【问题描述】:

我正在尝试通过代码(LINQ to XML)生成 XML,该代码遵循关于命名空间前缀的特定模式。我想生成由 2 个 XML 命名空间组成的以下输出(说明案例的示例;属性的顺序无关):

<name1 xmlns:space2="urn:schemas-upnp-org:namespace2/" xmlns="urn:schemas-upnp-org:namespace1/" name2="foo" space2:name4="demo">
  <name3>bar</name3>
</name1>

namespace1 必须是默认命名空间(无前缀),namespace2 有一个前缀“space2”(我知道,但不要怪我——有些标准需要这样的东西)。

我在 C# 中尝试了许多不同的方法。我最有可能的假设是:

public static readonly XNamespace NS1 = "urn:schemas-upnp-org:namespace1/";
public static readonly XNamespace NS2 = "urn:schemas-upnp-org:namespace2/";

public static readonly XName Name1 = NS1 + "name1";
public static readonly XName Name2 = NS1 + "name2";
public static readonly XName Name3 = NS1 + "name3";
public static readonly XName Name4 = NS2 + "name4"; // in namespace 2

void Test() {
    var y = new XElement(Name1,
            new XAttribute(XNamespace.Xmlns + "space2", NS2.NamespaceName),
            new XAttribute(Name2, "foo"),
            new XAttribute(Name4, "demo"),
            new XElement(Name3, "bar"));
    Trace.WriteLine(y.ToString());
}

但是,由于某种原因,这会出错。 namespace1 中的一些元素被分配了一个奇怪的前缀 "p1"。即使它们使用相同的命名空间引用,但似乎 LINQ 认为 Name1Name2 的命名空间不同,并声明了两次:

<name1 xmlns:space2="urn:schemas-upnp-org:namespace2/" p1:name2="foo" space2:name4="demo" xmlns:p1="urn:schemas-upnp-org:namespace1/" xmlns="urn:schemas-upnp-org:namespace1/">
  <p1:name3>bar</p1:name3>
</name1>

如果我为 namespace1 分配前缀或者如果我从 namespace2 中删除该属性,问题似乎不会出现,但这无济于事,因为这无济于事有问题。

所以问题的本质是:为什么LINQ 将XML 中的两个不同的命名空间声明分配给NS1?如何配置为始终映射到默认命名空间?

【问题讨论】:

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


    【解决方案1】:

    您正在为属性“foo”指定命名空间,这将为您的默认命名空间创建第二个映射。结果有 2 个有效的映射,并且可以为节点选择其中任何一个(可能是最新的)。

    请注意,除非属性具有显式前缀,否则属性位于空命名空间中 - 因此您的代码实际上会生成不同的 XML:您的属性名称是 {urn:schemas-upnp-org:namespace2/}foo 而不是 {}foo

    修复:不要为“foo”指定命名空间

      public static readonly XName Name2 = "name2";
    

    【讨论】:

    • 我不知道这一点。事实上,似乎许多 XML 模式设计者认为他们的属性都是不合格的,这意味着从 attributes 中删除名称空间可以解决问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2014-12-31
    • 2011-07-11
    相关资源
    最近更新 更多