我在 LINQ 中遇到一些命名空间问题。所以离开MSDN's Tutorial我们可以执行以下操作以使用 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);
这将为您提供 XML:
<Root xmlns="http://www.adventure-works.com">
<Child>child content</Child>
</Root>
但我想做的是:
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);
但这给了我以下 xml:
<Root xmlns="http://www.adventure-works.com">
<Child xmlns="">child content</Child>
</Root>
问题是我不想在我的子元素中使用 xmlns=""
(编辑:我不想在我的子元素中使用任何命名空间),我希望它看起来就像第一种方法生成它一样。我正在构建一个相当大的 XML 文件,因此我无法在同一声明中添加所有元素,并且需要能够使用多个 Add
和 SetAttributeValue
方法 XElements
在第一个元素上仍然有一个 xmlns
。有什么想法可以实现吗?
谢谢!
最佳答案
此行为是 XML 信息集的基础。 xmlns
声明的作用范围是所有子内容;因为您没有为子元素指定 namespace ,所以标准行为是将它放在未命名的 namespace 中。为了将未命名命名空间中的元素嵌套在声明默认命名空间的命名空间内,xmlns=''
声明需要将默认命名空间重置为未命名。
总而言之,根据您的编辑:
- 如果您不想在您的子元素中使用任何命名空间,则显式
xmlns=''
需要 中的 XML Namespaces specification为了覆盖文档元素中声明的命名空间。 - 如果您不想在您的子元素中使用任何命名空间声明(即
xmlns=''
东西),您需要确保在代码中将相同的 namespace 添加到所有名称中。
据我所知,没有办法让 XElement
自动继承其父级的命名空间。不过,在完成构建 DOM 后,您始终可以对其进行后处理,以在任何地方设置一个命名空间,方法与此类似:
foreach(var element in doc.Descendants())
element.Name = aw + element.Name.LocalName;
不过,我不认为这样做对于一次性代码以外的任何事情都是可取的,因为它可能会对可维护性产生不良影响。许多 XML 文档我不得不处理混合 namespace ,并且像上面的代码片段那样“粉碎” namespace 会破坏混合 namespace 文档的语义。
关于c# - 在 LINQ 中只设置一个命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4142048/