如何控制命名空间前缀 (LINQ to XML)

本文介绍如何在序列化 C# 和 Visual Basic 中的 XML 树时控制命名空间前缀。

在很多情况下,不需要控制命名空间前缀。 然而,某些 XML 编程工具需要它。 例如,可能正在操作 XSLT 样式表或 XAML 文档,其中包含引用特定命名空间前缀的嵌入式 XPath 表达式。 在这种情况下,必须用这些前缀序列化文档。 这是控制命名空间前缀的常见原因。

另一个常见原因是:希望用户手动编辑 XML 文档,而且希望创建方便用户键入的命名空间前缀。 例如,您可能正在生成 XSD 文档。 架构约定建议您使用 xsxsd 作为架构命名空间的前缀。

若要控制命名空间前缀,请插入声明命名空间的属性。 如果使用特定前缀声明命名空间,LINQ to XML 将在序列化时尝试接受此命名空间前缀。

若要创建一个声明具有前缀的命名空间的属性,请创建一个属性,该属性的名称的命名空间为 Xmlns,该属性的名称为命名空间前缀。 该属性的值即是命名空间的 URI。

示例:创建两个具有前缀的命名空间

本示例声明两个命名空间。 它指定 http://www.adventure-works.com 命名空间的前缀 awwww.fourthcoffee.com 命名空间的前缀 fc

XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);
Imports <xmlns:aw="http://www.adventure-works.com">
Imports <xmlns:fc="www.fourthcoffee.com">

Module Module1

    Sub Main()
        Dim root As XElement = _
            <aw:Root>
                <fc:Child>
                    <aw:DifferentChild>other content</aw:DifferentChild>
                </fc:Child>
                <aw:Child2>c2 content</aw:Child2>
                <fc:Child3>c3 content</fc:Child3>
            </aw:Root>
        Console.WriteLine(root)
    End Sub

This example produces the following output:

```xml
<aw:Root xmlns:aw="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <aw:DifferentChild>other content</aw:DifferentChild>
  </fc:Child>
  <aw:Child2>c2 content</aw:Child2>
  <fc:Child3>c3 content</fc:Child3>
</aw:Root>

另请参阅