本文提供了此 API 参考文档的补充说明。
此类表示命名空间的 XML 构造。
每个 XName 都包含一个 XNamespace. 即使某个元素不在命名空间中,该元素 XName 仍包含命名空间 XNamespace.None。 属性 XName.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 文本,这不涉及使用扩展名称。