在 XmlWriter 中处理命名空间

命名空间用于限定 XML 文档中的元素和属性的名称。 命名空间前缀将元素和属性与命名空间关联,命名空间反过来又与 URI 引用关联。 命名空间在 XML 文档中实现元素和属性名称的唯一性。

XmlWriter 维护与当前命名空间范围中定义的所有命名空间对应的命名空间堆栈。 在编写元素和属性时,可以通过下列方式利用命名空间:

  • 手动声明命名空间。

  • 用新的命名空间重写当前命名空间声明。

  • 在编写属性或元素时指定命名空间前缀。

手动声明命名空间

命名空间声明可以使用 WriteAttributeString 方法手动写出。 如果知道如何最大程度地优化命名空间声明的数目,可以使用此方法。 在以下代码中,命名空间声明在根元素上创建。

writer.WriteStartElement("root")
writer.WriteAttributeString("xmlns", "x", Nothing, "urn:1")
writer.WriteStartElement("item", "urn:1")
writer.WriteEndElement()
writer.WriteStartElement("item", "urn:1")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("root");
writer.WriteAttributeString("xmlns", "x", null, "urn:1");
writer.WriteStartElement("item", "urn:1");
writer.WriteEndElement();
writer.WriteStartElement("item", "urn:1");
writer.WriteEndElement();
writer.WriteEndElement();

代码生成以下 XML 字符串。

<root xmlns:x="urn:1">
  <x:item/>
  <x:item/>
</root>

因为命名空间声明位于 root 元素上,所以,不能在两个子元素上重复。 item 元素还从命名空间声明中选取前缀。

重写当前命名空间

可以手动重写与给定前缀关联的命名空间。 在以下代码中,"x" 前缀的命名空间 URI 由 "123" 更改为 "abc"。

writer.WriteStartElement("x", "root", "123")
writer.WriteStartElement("item")
writer.WriteAttributeString("xmlns", "x", Nothing, "abc")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("x", "root", "123");
writer.WriteStartElement("item");
writer.WriteAttributeString("xmlns", "x", null, "abc");
writer.WriteEndElement();
writer.WriteEndElement();

代码生成以下 XML 字符串:

<x:root xmlns:x="123">
  <item xmlns:x="abc" />
</x:root>

指定命名空间前缀

也可以通过在编写元素或属性时显式指定前缀,传递要使用的命名空间前缀。 用于编写元素和属性的许多方法都允许指定命名空间前缀。 以下代码显示如何在编写元素时指定前缀。

writer.WriteStartElement("x", "root", "urn:1")
writer.WriteStartElement("y", "item", "urn:1")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("x", "root", "urn:1");
writer.WriteStartElement("y", "item", "urn:1");
writer.WriteEndElement();
writer.WriteEndElement();

代码写入以下 XML 字符串:

<x:root xmlns:x="urn:1">
  <y:item xmlns:y="urn:1"/>
</x:root>

XmlWriter 保留两个前缀 "x" 和 "y"。

注意注意

在提供前缀时,所有 XmlWriter 实现(包括 XmlTextWriter)均允许命名空间是空的。在这种情况下,写入器忽略该前缀。这是 Microsoft .NET Framework 2.0 版中在行为方面的更改。在以前的版本中,此情况将引发 XmlException

请参见

其他资源

用 XmlWriter 编写 XML