因为您没有添加命名空间声明,所以 dyn 命名空间成为默认命名空间。
然后,当您添加没有命名空间的子元素时,必须添加一个没有命名空间的命名空间声明,以表明它不在默认命名空间内。
如果您的 dyn 命名空间不是默认命名空间,请尝试以下代码:
XNamespace dyn = "https://www.abc.at/dyn";
XElement positions = new XElement(
dyn + "Positions",
new XAttribute(XNamespace.Xmlns + "dyn", "https://www.abc.at/dyn"),
new XElement("Vector2-Array"));
这会产生以下输出:
<dyn:Positions xmlns:dyn="https://www.abc.at/dyn">
<Vector2-Array />
</dyn:Positions>
请注意,当您开始将此元素附加到其他文档时,如果命名空间有任何不匹配,您可能会得到更多类似于原始问题的行为。
OP 专门提出了将这个元素附加到另一个也包含命名空间声明的元素的主题。
我创建了这段代码来测试:
XNamespace dyn = "https://www.abc.at/dyn";
XElement positions = new XElement(
dyn + "Positions",
new XAttribute(XNamespace.Xmlns + "dyn", "https://www.abc.at/dyn"),
new XElement("Vector2-Array"));
XElement root = new XElement(
dyn + "root",
new XAttribute(XNamespace.Xmlns + "dyn", "https://www.abc.at/dyn"));
root.Add(positions);
使用调试器时,添加Positions后root元素的XML是这样的:
<dyn:root xmlns:dyn="https://www.abc.at/dyn">
<dyn:Positions xmlns:dyn="https://www.abc.at/dyn">
<Vector2-Array />
</dyn:Positions>
</dyn:root>
所以命名空间声明是重复的。
但是,当将 XML 保存或格式化为字符串时,可以使用 SaveOption 或 OmitDuplicateNamespaces:
Console.WriteLine(root.ToString(SaveOptions.OmitDuplicateNamespaces));
结果输出如下:
<dyn:root xmlns:dyn="https://www.abc.at/dyn">
<dyn:Positions>
<Vector2-Array />
</dyn:Positions>
</dyn:root>
因为重复的命名空间声明实际上什么都不做(即使它们很丑陋),如果 XML 的显示很重要,那么可以通过这种方式删除它们。
从功能上讲,只要它们匹配,重复的命名空间声明实际上不会做任何事情。