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 文本,也会为 XElement 创建一个 XName 对象。

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

在命名空间中创建 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

保证 XName 对象的 Namespace 属性不为 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.

使用扩展名称

还可以在窗体 {namespace}localname 中使用扩展的 XML 名称创建 XName

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>

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

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

XName 对象已原子化

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

此功能有很多优势,包括可加快执行查询的速度。 筛选元素或属性的名称时,以谓词表示的比较使用标识比较,而不是值比较。 与比较两个字符串相比,确定两个引用实际上引用同一对象要快得多。