使用全局命名空间 (Visual Basic) (LINQ to XML)

Visual Basic 2008 中 XML 文本的一项重要功能是能够使用 Imports 语句声明 XML 命名空间。 使用此功能时,您可以声明使用前缀的 XML 命名空间,也可以声明默认的 XML 命名空间。

此功能在两种情况下有用。 首先,使用 XML 文本声明的命名空间不会延续到嵌入的表达式。 声明全局命名空间可减少与命名空间一起使用嵌入表达式所必须执行的工作量。 其次,您必须声明全局命名空间才能与 XML 属性一起使用命名空间。

您可以在项目级别声明全局命名空间。 您也可以在模块级别声明全局命名空间,这会重写项目级全局命名空间。 最后,您可以使用 XML 文本重写全局命名空间。

在使用全局声明的命名空间中的 XML 文本或 XML 属性时,您可以在 Visual Studio 中通过将鼠标悬停在 XML 文本或属性上来查看扩展的 XML 文本或属性的名称。 您会在工具提示中看到扩展的名称。

使用 GetXmlNamespace 方法可以获取对应于全局命名空间的 XNamespace 对象。

全局命名空间的示例

下面的示例通过使用 Imports 语句声明一个默认的全局命名空间,然后使用 XML 文本在该命名空间中初始化一个 XElement 对象:

Imports <xmlns="https://www.adventure-works.com">

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

该示例产生下面的输出:

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

下面的示例声明一个具有前缀的全局命名空间,然后使用 XML 文本初始化一个元素:

Imports <xmlns:aw="https://www.adventure-works.com">

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

该示例产生下面的输出:

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

全局命名空间和嵌入式表达式

使用 XML 文本声明的命名空间不会延续到嵌入的表达式。 下面的示例声明一个默认命名空间。 然后对 Child 元素使用一个嵌入式表达式。

Dim root As XElement = _
    <Root xmlns="https://www.adventure-works.com">
        <%= <Child/> %>
    </Root>
Console.WriteLine(root)

该示例产生下面的输出:

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

您可以看到,生成的 XML 包括一个默认命名空间声明,从而使 Child 元素不在任何命名空间中。

您可以在嵌入式表达式中重新声明该命名空间,如下所示:

Dim root As XElement = _
    <Root xmlns="https://www.adventure-works.com">
        <%= <Child xmlns="https://www.adventure-works.com"/> %>
    </Root>
Console.WriteLine(root)

该示例产生下面的输出:

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

但是,这种方法更不便于使用,更好的方法是使用全局默认命名空间。 通过使用全局默认命名空间,您可以使用 XML 文本而无需声明命名空间。 生成的 XML 将处于全局声明的默认命名空间中。

Imports <xmlns="https://www.adventure-works.com">

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

该示例产生下面的输出:

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

与 XML 属性一起使用命名空间

如果您使用位于某一命名空间中的 XML 树并使用 XML 属性,则必须使用全局命名空间,以使 XML 属性也位于正确的命名空间中。 下面的示例在一个命名空间中一个声明 XML 树。 然后打印 Child 元素的计数。

Dim root As XElement = _
    <Root xmlns="https://www.adventure-works.com">
        <Child>content</Child>
    </Root>
Console.WriteLine(root.<Child>.Count())

本示例指示没有 Child 元素。 它将生成以下输出:

0

但如果您声明一个默认的全局命名空间,则 XML 文本和 XML 属性都将位于该默认的全局命名空间中:

Imports <xmlns="https://www.adventure-works.com">

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

本示例指示有一个 Child 元素。 它将生成以下输出:

1

如果您声明一个具有前缀的全局命名空间,则可以对 XML 文本和 XML 属性使用该前缀:

Imports <xmlns:aw="https://www.adventure-works.com">

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

XNamespace 和全局命名空间

通过使用 GetXmlNamespace 方法,可以获取一个 XNamespace 对象:

Imports <xmlns:aw="https://www.adventure-works.com">

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

该示例产生下面的输出:

https://www.adventure-works.com