Вы можете явно переопределить это поведение, указав атрибут xmlns:
XNamespace ns = "urn:test";
new XDocument (
new XElement ("root",
new XAttribute (XNamespace.Xmlns + "ds", ns),
new XElement (ns + "foo",
new XAttribute ("xmlns", ns),
new XElement (ns + "bar", "content")
))
).Dump ();
<root xmlns:ds="urn:test">
<foo xmlns="urn:test">
<bar>content</bar>
</foo>
</root>
По умолчанию поведение заключается в указании встроенного xmlns.
XNamespace ns = "urn:test";
new XDocument (
new XElement ("root",
new XElement (ns + "foo",
new XElement (ns + "bar", "content")
))
).Dump ();
Дает вывод:
<root>
<foo xmlns="urn:test">
<bar>content</bar>
</foo>
</root>
Таким образом, поведение по умолчанию - это желаемое поведение, кроме случаев, когда пространство имен уже определено:
XNamespace ns = "urn:test";
new XDocument (
new XElement ("root",
new XAttribute (XNamespace.Xmlns + "ds", ns),
new XElement (ns + "foo",
new XElement (ns + "bar", "content")
))
).Dump ();
<root xmlns:ds="urn:test">
<ds:foo>
<ds:bar>content</ds:bar>
</ds:foo>
</root>