Vb.net LINQ到XML:抑制子节点中的冗余命名空间属性

Vb.net LINQ到XML:抑制子节点中的冗余命名空间属性,vb.net,linq,linq-to-xml,Vb.net,Linq,Linq To Xml,如果一个节点属于一个名称空间,默认情况下,它的子节点属于同一名称空间。因此,不需要在每个子级上提供xmlns属性,这很好 不过 如果我像这样创建两个节点: Dim parent = <parent xmlns="http://my.namespace.org"/> Dim child = <child xmlns="http://my.namespace.org">value</child> parent.Add(child) Console.WriteL

如果一个节点属于一个名称空间,默认情况下,它的子节点属于同一名称空间。因此,不需要在每个子级上提供
xmlns
属性,这很好

不过

如果我像这样创建两个节点:

Dim parent = <parent xmlns="http://my.namespace.org"/>
Dim child = <child xmlns="http://my.namespace.org">value</child>

parent.Add(child)

Console.WriteLine(parent.ToString)
Dim父级=
Dim child=值
父项添加(子项)
Console.WriteLine(parent.ToString)
结果是:

<parent xmlns="http://my.namespace.org">
  <child xmlns="http://my.namespace.org">value</child>
</parent>

价值
但是,如果以不太方便的方式创建它们:

Dim parent = <parent xmlns="http://my.namespace.org"/>
Dim child As New XElement(XName.Get("child", "http://my.namespace.org")) With {.Value = "value"}

parent.Add(child)

Console.WriteLine(parent.ToString)
Dim父级=
将子对象暗显为新的XElement(XName.Get(“子对象”),”http://my.namespace.org“”)和{.Value=“Value”}
父项添加(子项)
Console.WriteLine(parent.ToString)
结果更令人满意:

<parent xmlns="http://my.namespace.org">
  <child>value</child>
</parent>

价值
显然,我更喜欢使用第一种方法,因为它更直观,更容易编码。不使用方法2还有另一个原因——有时我需要使用
XElement.Parse
创建节点,解析包含
xmlns
属性的字符串,该属性产生与方法1完全相同的结果


所以问题是——我如何获得方法2的漂亮输出,像方法1一样创建节点?我看到的唯一选择是创建一个方法来克隆给定的XElement,根据方法2模式有效地重新创建它,但这看起来很难看。我正在寻找一个因某种原因而被我忽略的更明显的解决方案。

啊……名称空间——它们将是我的死亡

给你:

Dim ns As XNamespace = "http://my.namespace.org"
Dim parent = <<%= ns + "parent" %>/>
Dim child = <<%= ns + "child" %>>value</>
parent.Add(child)
请注意,
元素是首先创建的。这同样适用于非默认名称空间,如
导入
,然后使用
创建


我曾经读过,但还没有再次发现,将XML文本与我不知道你叫它什么,但它是父对象。添加(某物)-东西是个坏主意。

这是一个很棒的技巧!文字有点混乱,但输出更干净。这个技巧确实不错,但它只部分解决了问题。如果我有一个解析的XML字符串,则输出包含子节点的名称空间。因此,我在寻找一种方法,对已经构建的节点设置某种I-don-want-this标志,而不是用一种特殊的方法来构建节点——因为我有时不能使用这种特殊的方法。然而,如果没有其他解决办法,我很乐意接受这个答案。@GSerg:啊,我现在明白了。我已经用我希望对你有用的东西更新了答案。@GSerg:下面的答案能回答你的问题吗?
Imports <xmlns="http://my.namespace.org">
Module Main
    Sub SomeSub()
        Dim child = <child>value</child>
        Dim parent = <parent><%= child %></parent>
        Console.WriteLine(parent.ToString)
    End Sub
End Module