System.Xml.Linq.XName 类

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

XML 名称包括命名空间和本地名称。 完全限定的名称是命名空间和本地名称的组合。

创建 XName 对象

XName 不包含任何公共构造函数。 相反,此类提供来自“String”的隐式转换,使你可以创建 XName。 使用此转换的最常见位置是在构造元素或属性时:构造函数的第一个参数 XElement 是一个 XName。 通过传递字符串,可以利用隐式转换。 以下代码创建了一个没有所属命名空间的元素:

XElement root = new XElement("ElementName", "content");
Console.WriteLine(root);

在 Visual Basic 中,更适合使用 XML 文本:

Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)

此示例生成以下输出:

<ElementName>content</ElementName>

将字符串分配给 XName 时,使用来自 String 的隐式转换。

Visual Basic 示例使用 XML 文本创建 XElement 。 即使使用 XML 文本,也会为 XName 创建一个 XElement 对象。

此外,还可为 Get 对象调用 XName 方法。 但是,建议的方法是使用字符串中的隐式转换。

在命名空间中创建 XName

与 XML 一样,一个 XName 可以位于命名空间中,也可以不位于命名空间中。

对于 C#,建议在命名空间中创建对象 XName 的方法是声明 XNamespace 对象,然后使用加法运算符的重写。

对于 Visual Basic,建议的方法是使用 XML 文本和全局命名空间声明来创建命名空间中的 XML。

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "ElementName", "content");
Console.WriteLine(root);
Imports <xmlns="http://www.adventure-works.com">

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

此示例生成以下输出:

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

创建位于命名空间中的 XName

保证 Namespace 对象的属性 XName 不为 null。 XName如果不存在命名空间,则该Namespace属性将设置为 None。 以下代码演示了这一点:

XElement root = new XElement("ElementName", "content");
if (root.Name.Namespace == XNamespace.None)
    Console.WriteLine("The element is in no namespace.");
else
    Console.WriteLine("The element is in a namespace.");
Dim root As XElement = <ElementName>content</ElementName>
If (root.Name.Namespace Is XNamespace.None) Then
    Console.WriteLine("The element is in no namespace.")
Else
    Console.WriteLine("The element is in a namespace.")
End If

此示例生成以下输出:

The element is in no namespace.

使用扩展名称

您还可以从格式为XName的扩展 XML 名称中创建一个{namespace}localname

XElement root = new XElement("{http://www.adventure-works.com}ElementName", "content");
Console.WriteLine(root);
Dim root As XElement = New XElement("{http://www.adventure-works.com}ElementName", "content")
Console.WriteLine(root)

此示例生成以下输出:

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

请注意,与创建 XName 对象并使用加法运算符的重写相比,通过扩展名称创建 XNamespace 的效率更低。 它的效率也低于在 Visual Basic 中导入全局命名空间和使用 XML 文本。

如果您使用扩展名创建 XName,则 LINQ to XML 必须查找命名空间的原子化实例。 每次使用扩展名称时,必须重复此操作。 编写 LINQ 查询时,此额外时间可能会忽略不计;但是,创建大型 XML 树时,这一点可能很重要。

XName 对象已原子化

XName 保证对象被原子化;也就是说,如果两个 XName 对象具有相同的命名空间和完全相同的本地名称,则它们将共享同一实例。 出于此目的,还显式提供了相等运算符和比较运算符。

除其他优势外,此功能还允许更快地执行查询。 筛选元素或属性的名称时,以谓词表示的比较使用标识比较,而不是值比较。 确定两个引用实际上引用同一对象比比较两个字符串要快得多。