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
用作方法参数时,null
和 String.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 不验证传递给 WriteDocType 或 WriteRaw 方法的任何数据。 不应将任意数据传递给这些方法。
如果更改了默认设置,则不能保证生成的输出是格式正确的 XML 数据。
不要接受来自不可信的源的支持组件,例如 Encoding 对象。