【发布时间】: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 认为 Name1 和 Name2 的命名空间不同,并声明了两次:
<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