在LINQ中仅设置一个命名空间

Ian*_*las 4 c# linq namespaces linq-to-xml

我在LINQ中遇到了一些名称空间问题.因此,从MSDN的教程开始,我们可以执行以下操作,使用LINQ将命名空间添加到XML文档:

// Create an XML tree in a namespace.
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);
Run Code Online (Sandbox Code Playgroud)

哪个会给你XML:

<Root xmlns="http://www.adventure-works.com">
  <Child>child content</Child>
</Root>
Run Code Online (Sandbox Code Playgroud)

但我想做的是:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Roots");
XElement child = new XElement("Child", "child content");
root.Add(child);

Console.WriteLine(root);
Run Code Online (Sandbox Code Playgroud)

但这给了我以下xml:

<Root xmlns="http://www.adventure-works.com">
    <Child xmlns="">child content</Child>
</Root>
Run Code Online (Sandbox Code Playgroud)

问题是我不想xmlns=""在我的子元素中编辑(编辑:我不想在我的子元素中使用任何名称空间),我希望它看起来就像第一种产生它的方式.我建立一个相当大的XML文件,所以我不能添加的所有元素在同一声明,并需要能够使用AddSetAttributeValue多种方法XElements仍然具有xmlns的第一个元素.我有什么想法可以做到这一点?

谢谢!

Jef*_*tin 6

此行为是XML信息集的基础.xmlns声明的效果适用于所有儿童内容; 由于您没有为子元素指定命名空间,因此标准行为是将其放在未命名的命名空间中.为了将一个元素嵌套在一个声明默认命名空间的未命名命名空间内,需要声明将默认命名空间xmlns=''重置为未命名.

总结一下,根据您的编辑:

  • 如果你不希望任何命名空间中的子元素,那么明确xmlns=''要求XML命名空间规范,以覆盖在文档元素声明的名称空间.
  • 如果您不希望子元素中有任何名称空间声明( xmlns=''东西),则需要确保在代码中将所有名称空间添加到相同的名称空间中.

我不知道如何XElement自动继承其父级的命名空间.但是,在构建完DOM之后,您总是可以对其进行后处理,以便在任何地方设置一个名称空间,类似于:

foreach(var element in doc.Descendants())
    element.Name = aw + element.Name.LocalName;
Run Code Online (Sandbox Code Playgroud)

我不相信这样做除了一次性代码之外的其他任何东西都是可取的,因为它可能会对可维护性产生不利影响.我必须处理混合命名空间的大量XML文档,以及像上面的代码片段一样"粉碎"命名空间确实会破坏混合命名空间文档的语义.