System.Xml.XmlTextWriter 类

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

XmlTextWriter 类实现了 XmlWriter 类。

注意

建议使用 XmlWriter.Create 方法和 XmlWriterSettings 类来创建 XmlWriter 实例,以利用新功能。

XmlTextWriter 维护与当前元素堆栈中定义的所有命名空间对应的命名空间堆栈。 使用 XmlTextWriter 可以手动声明命名空间。

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

上述 C# 代码生成以下输出内容。 XmlTextWriter 将命名空间声明提升到根元素,以避免其在两个子元素上重复。 该子元素还从命名空间声明中选取前缀。

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

XmlTextWriter 还允许替代当前命名空间声明。 在下面的示例中,命名空间 URI“123”由“abc”替代,以生成 XML 元素 <x:node xmlns:x="abc"/>

w.WriteStartElement("x","node","123");
w.WriteAttributeString("xmlns","x",null,"abc");

通过使用将前缀作为参数的写入方法,还可以指定要使用的前缀。 在以下示例中,将两个不同的前缀映射到同一命名空间 URI 以生成 XML 文本 <x:root xmlns:x="urn:1"><y:item xmlns:y="urn:1"/></x:root>

XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteEndElement();
w.WriteEndElement();
w.Close();

如果有多个命名空间声明将不同的前缀映射到同一命名空间 URI,XmlTextWriter 会按照相反的顺序遍历命名空间声明堆栈,并选取最近的命名空间声明。

XmlTextWriter w = new XmlTextWriter(Console.Out);
w.Formatting = Formatting.Indented;
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteAttributeString("attr","urn:1","123");
w.WriteEndElement();
w.WriteEndElement();
w.Close();

在上述 C# 示例中,由于 WriteAttributeString 调用未指定前缀,编写器使用推送到命名空间堆栈的最后一个前缀,并生成以下 XML:

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

如果命名空间冲突发生,XmlTextWriter 通过生成备用前缀来解决这些冲突。 例如,如果属性和元素具有相同的前缀,但命名空间不同,则 XmlWriter 为该属性生成备用前缀。 生成的前缀命名为 n{i},其中 i 是一个从 1 开始的数字。 每个元素的数字重置为 1。

与命名空间 URI 关联的属性必须具有前缀(默认命名空间不适用于属性)。 这符合第 5.2 节中 W3C 关于 XML 中命名空间的建议。 如果属性引用了命名空间 URI,但没有指定前缀,则编写器将为该属性生成前缀。

编写空元素时,在标记名称和结束标记之间添加额外的空间,例如 <item />。 这提供了与较旧浏览器的兼容性。

当一个 String 用作方法参数时,nullString.Empty 是等效的。 String.Empty 遵循 W3C 规则。

若要写入强类型化的数据,请使用 XmlConvert 类将数据类型转换为字符串。 例如,以下 C# 代码将数据从 Double 转换为 String 并写入元素 <price>19.95</price>

Double price = 19.95;
writer.WriteElementString("price", XmlConvert.ToString(price));

XmlTextWriter 不检查以下内容:

  • 属性和元素名称中的无效字符。
  • 不符合指定编码的 Unicode 字符。 如果 Unicode 字符不适合指定的编码,则 XmlTextWriter 不会将 Unicode 字符转义为字符实体。
  • 重复的属性。
  • DOCTYPE 公共标识符或系统标识符中的字符。

安全注意事项

使用 XmlTextWriter 类时,需要考虑以下事项。

  • XmlTextWriter 抛出的异常可能会泄露不希望向上层应用程序传递的路径信息。 应用程序必须捕获异常并进行相应的处理。

  • 在将 XmlTextWriter 传递给另一个应用程序时,基础流会公开给该应用程序。 如果需要将 XmlTextWriter 传递给不完全可信的应用程序,应使用通过 XmlWriter 方法创建的 Create 对象。

  • XmlTextWriter 不验证传递给 WriteDocTypeWriteRaw 方法的任何数据。 不应将任意数据传递给这些方法。

  • 如果更改了默认设置,则不能保证生成的输出是格式正确的 XML 数据。

  • 不要接受来自不可信的源的支持组件,例如 Encoding 对象。