System.Xml.Linq.XNamespace 类

本文提供了此 API 参考文档的补充说明。

此类表示命名空间的 XML 构造。

每个 XName 都包含一个 XNamespace。 即使某个元素不在命名空间中,该元素的 XName 仍包含命名空间 XNamespace.NoneXName.Namespace 属性一定不会是 null

创建 XNamespace 对象

创建 XNamespace 对象的最常见方法是向其分配字符串。 然后,可以使用加法运算符的重写将命名空间与本地名称合并。 以下示例演示了此习语:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root", "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", "Content")
Console.WriteLine(root)

但是,在 Visual Basic 中,通常要声明全局默认命名空间,如下所示:

Imports <xmlns='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>Content</Root>
        Console.WriteLine(root)
    End Sub
End Module

该示例产生下面的输出:

<Root xmlns="http://www.adventure-works.com">Content</Root>

如果将字符串分配给 XNamespace,会使用来自“String”的隐式转换。

有关详细信息和示例,请参阅如何使用 C# (LINQ to XML) 中的命名空间创建文档

有关在 Visual Basic 中使用命名空间的详细信息,请参阅“使用 XML 命名空间”。

控制命名空间前缀

如果创建声明命名空间的属性,则属性中指定的前缀将保留在串行化的 XML 中。 若要创建一个声明具有前缀的命名空间的属性,请创建一个属性,该属性的名称的命名空间为 Xmlns,该属性的名称为命名空间前缀。 该属性的值即是命名空间的 URI。 以下示例演示了此习语:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"), _
    "Content")
Console.WriteLine(root)

在 Visual Basic 中,通常会使用全局命名空间声明,而不是创建命名空间节点来控制命名空间前缀:

Imports <xmlns:aw='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <aw:Root>Content</aw:Root>
        Console.WriteLine(root)
    End Sub
End Module

该示例产生下面的输出:

<aw:Root xmlns:aw="http://www.adventure-works.com">Content</aw:Root>

有关详细信息,请参阅“如何控制命名空间前缀”。

创建默认命名空间

构造将成为命名空间的属性时,如果属性名称具有特殊值“xmlns”,则在串行化 XML 树时,命名空间将声明为默认命名空间。 名称为“xmlns”本身的特殊属性不在任何命名空间中。 该属性的值是命名空间 URI。

以下示例会创建一个 XML 树,其中包含以该命名空间将成为默认命名空间的方式声明的属性:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "content")
);
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute("xmlns", "http://www.adventure-works.com"), _
    New XElement(aw + "Child", "content") _
)
Console.WriteLine(root)

在 Visual Basic 中,通常会使用全局默认命名空间声明,而不是创建命名空间节点来创建默认命名空间:

Imports <xmlns='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>
                <Child>content</Child>
            </Root>
        Console.WriteLine(root)
    End Sub
End Module

该示例产生下面的输出:

<Root xmlns="http://www.adventure-works.com">
  <Child>content</Child>
</Root>

XNamespace 原子化

XNamespace 对象一定不会是原子化的;即,如果两个 XNamespace 对象具有完全相同的 URI,则它们将共享同一实例。 出于此目的,显式提供了相等运算符和比较运算符。

使用扩展名称

指定命名空间和本地名称的另一种方法是使用窗体 {namespace}name 中的扩展名称:

XElement e = new XElement("{http://www.adventure-works.com}Root",
     new XAttribute("{http://www.adventure-works.com}Att", "content")
);
Console.WriteLine(e);
Dim e As XElement = New XElement("{http://www.adventure-works.com}Root", _
     New XAttribute("{http://www.adventure-works.com}Att", "content") _
)
Console.WriteLine(e)

该示例产生下面的输出:

<Root p1:Att="content" xmlns:p1="http://www.adventure-works.com" xmlns="http://www.adventure-works.com" />

这种方法的性能较低。 每次将包含扩展名的字符串传递给 LINQ to XML 时,都必须分析名称,查找原子化命名空间,再查找原子化名称。 这个过程会占用 CPU 时间。 如果性能很重要,则可能需要使用不同的方法。

使用 Visual Basic 时,建议的方法是使用 XML 文本,这不涉及使用扩展名称。