【问题标题】:LINQ to XML: suppressing redundant namespace attribute in child nodesLINQ to XML:抑制子节点中的冗余命名空间属性
【发布时间】:2010-02-25 00:07:29
【问题描述】:

如果一个节点属于一个命名空间,它的子节点默认属于同一个命名空间。所以不需要为每个孩子提供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)

结果是这样的:

<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)

结果更理想:

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

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

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

【问题讨论】:

  • @GSerg:下面的答案能回答你的问题吗?

标签: vb.net linq linq-to-xml


【解决方案1】:

呃......命名空间 - 它们将是我的死亡。

给你:

Dim ns As XNamespace = "http://my.namespace.org"
Dim parent = <<%= ns + "parent" %>/>
Dim child = <<%= ns + "child" %>>value</>
parent.Add(child)

为了能够使用XElement.Parse 并使子节点与其父节点的命名空间保持同步,最好使用全局命名空间。在 VB.NET 中很容易做到。在您的模块/类的顶部,只需使用 Imports,所有父母和孩子都将使用此命名空间。例如:

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

注意&lt;child/&gt; 元素是首先创建的。这同样适用于非默认命名空间,例如 Imports &lt;xmlns:p="http://parent.namespace.org"&gt;,然后使用 &lt;p:child/&gt;&lt;p:parent/&gt; 创建。

我曾经读过,但还没有再次发现,将 XML Literals 与 I-don't-know-what-you-call-it-but-it's-that-parent.Add(something)-thing 混合是一个坏主意.

【讨论】:

  • 这是一个很棒的技巧!文字有点乱,但输出更干净。
  • 这个技巧确实不错,但它只是部分解决了问题。如果我有一个要解析的 XML 字符串,则输出包含子节点的命名空间。所以我一直在寻找一种方法来针对已经构建的节点设置某种“我不想要这些”标志,而不是一种构建节点的特殊方式——因为有时我不能使用这种特殊方式。但是,如果不存在其他解决方案,我很乐意接受这个答案。
  • @GSerg:啊,我现在明白了。我已经用我希望对你有用的东西更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
相关资源
最近更新 更多