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 对象具有完全相同的命名空间和本地名称,它们将共享同一实例。 出于此目的,还显式提供了相等运算符和比较运算符。
此功能有很多优势,包括可加快执行查询的速度。 筛选元素或属性的名称时,以谓词表示的比较使用标识比较,而不是值比较。 与比较两个字符串相比,确定两个引用实际上引用同一对象要快得多。