从 XmlWriter 派生的 XmlTextWriter 将 XML 写入文件、控制台、流和其他输出类型。在编写 XML 时,方法将进行额外的工作以生成格式正确的 XML。下表提供了方法列表,这些方法为您执行确保数据格式正确的工作。
方法 |
所做工作的说明 |
---|---|
WriteAttributeString |
XmlTextWriter 根据找到的内容来转义属性的文本内容。 |
WriteString |
XmlTextWriter 转义特殊字符,在需要时用 &<> 和数字字符实体替换它们。 |
WriteBase64 |
XmlTextWriter 对 base64 字节进行编码,这样就可以在 XmlReader 上用 ReadBinary 读取这些字节。 |
下面的附加任务由 XmlTextWriter 完成,以确保 XML 的格式正确:
确保 XML 元素以正确的顺序编写。例如,不允许在元素外部编写属性,在属性内部编写 CDATA 块,或者编写多个根元素。另外,还确保 <?xml 声明首先出现,并确保 <!DOCTYPE 节点在根元素之前出现。
确保 xml:space 属性的值和格式正确,并确保其值符合 World Wide Web Consortium (W3C) Extensible Markup Language (XML) 1.0 (fourth edition)(万维网联合会 (W3C) 可扩展标记语言 (XML) 1.0 [第四版])建议。下面的示例显示 WriteAttributeString 方法中 xml:space 的有效值的用法:
w.WriteAttributeString("xml:space", "", "preserve");
xml:space 属性的有效值包括 default 和 preserve。如果参数不是这些值之一,将引发 ArgumentException。
检查何时将字符串用作参数(如 Null==String.Empty 和 String.Empty))以及是否符合 W3C 规则。
下表显示了由 XmlTextWriter 定义的、不是在 XmlWriter 中继承或定义的或是从 Object 继承的其他方法和属性。
方法或属性 |
说明 |
---|---|
XmlTextWriter |
创建 XmlTextWriter 的一个实例,该实例接受文件名、流或 TextWriter。存在一个带附加参数的重载方法,该参数定义编码类型。 |
指定是否支持命名空间。当它设置为 false 时,不写出 xmlns 声明,可以指定包含任意多个冒号的元素名称。 |
|
指定是否将缩进用于格式化输出。 |
|
定义在进行缩进的 Formatting 时用于缩进的字符。 |
|
定义在进行缩进的 Formatting 时,为层次结构中的每一层写出的 IndentChars 数目。 |
|
定义用于将属性值括起来的字符。该字符必须是单引号 ' 或双引号 "。 |
|
返回 XmlTextWriter 正在写入的流。如果 XmlTextWriter 是用不是从 StreamWriter 派生的 TextWriter 构造的,则返回空。 |
下面的示例使用 XmlTextWriter 创建 XML 输出。
Shared Sub WriteQuote(writer As XmlWriter, symbol As String, price As Double, change As Double, volume As Long)
writer.WriteStartElement("Stock")
writer.WriteAttributeString("Symbol", symbol)
writer.WriteElementString("Price", XmlConvert.ToString(price))
writer.WriteElementString("Change", XmlConvert.ToString(change))
writer.WriteElementString("Volume", XmlConvert.ToString(volume))
writer.WriteEndElement()
End Sub 'WriteQuote
Public Shared Sub Main()
Dim writer As New XmlTextWriter(Console.Out)
writer.Formatting = Formatting.Indented
WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000)
writer.Close()
End Sub 'Main
static void WriteQuote(XmlWriter writer, string symbol,
double price, double change, long volume)
{
writer.WriteStartElement("Stock");
writer.WriteAttributeString("Symbol", symbol);
writer.WriteElementString("Price", XmlConvert.ToString(price));
writer.WriteElementString("Change", XmlConvert.ToString(change));
writer.WriteElementString("Volume", XmlConvert.ToString(volume));
writer.WriteEndElement();
}
public static void Main(){
XmlTextWriter writer = new XmlTextWriter(Console.Out);
writer.Formatting = Formatting.Indented;
WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000);
writer.Close();
}
输出
<Stock Symbol="MSFT">
<Price>74.125</Price>
<Change>5.89</Change>
<Volume>69020000</Volume>
</Stock>
WriteQuote 方法的输入是堆栈符号,它是以 string 的形式出现的。price 和 change 声明为 double,volume 声明为 long。要将这些变量转换为字符串,请使用 XmlConvert 类。它具有将所有强数据类型转换为字符串的方法。另外,XmlConvert 类还具有通过将字符串转换为 Microsoft .NET Framework 数据类型进行相反转换的方法。有关更多信息,请参见 XML 名称的字符编码和 XML 数据类型的转换。
有关演示如何将 XML 写入文件的示例代码,请参见 XmlTextWriter.WriteProcessingInstruction。有关演示如何将 XML 写入控制台的示例代码,请参见 XmlTextWriter.WriteString。
下面的代码显示如何编写生成 <price>19.95</price> 的元素:
'Write the price.writer.WriteElementString("price", "19.95")
//Write the price.writer.WriteElementString("price", "19.95");
下面的代码显示如何编写生成 <element name="purchaseOrder"/> 的属性:
writer.WriteStartElement("element")
writer.WriteAttributeString("name", "purchaseOrder")
writer.WriteEndElement()
writer.WriteStartElement("element");
writer.WriteAttributeString("name", "purchaseOrder");
writer.WriteEndElement();
WriteAttributeString 方法写出属性和命名空间声明
WriteAttributeString 方法有两个不同的任务。一个任务是写出属性并将其与用户定义的命名空间前缀关联。第二个任务是生成命名空间声明。如果写出属性并且 localname 参数为 xmlns,则该方法被视为是创建命名空间声明。
在下面的代码示例中,WriteAttributeString 方法用于在元素内写出属性。
'Write the genre attribute.writer.WriteAttributeString("genre", "novel")
'Write the ISBN attribute.writer.WriteAttributeString("ISBN", "1-8630-014")
//Write the genre attribute.writer.WriteAttributeString("genre", "novel");
//Write the ISBN attribute.writer.WriteAttributeString("ISBN", "1-8630-014");
WriteAttributeString 还根据找到的内容转义属性的文本内容。如果使用双引号,则 XmlTextWriter 在属性值的文本内容中用 " 进行转义。如果使用单引号,则用 ' 转义属性值的文本内容。
为了生成命名空间声明,提供一个重载的 WriteAttributeString 方法,允许应用程序定义命名空间声明。下面的代码示例创建两个默认命名空间。第一个声明将所有没有前缀的元素绑定到第一个命名空间声明,而任何用“po”前缀声明的元素则被绑定到第二个命名空间声明。
' Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", Nothing, "http://www.w3.org/2000/10/XMLSchema")
' Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", Nothing, "https://contoso.com/po")
// Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", null, "http://www.w3.org/2000/10/XMLSchema");
// Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", null, "https://contoso.com/po");
Close 方法
Close 方法在流关闭时检查 XML 文档是否有效。这样可以防止创建无效的 XML 文档,并确保 XML 的格式是正确的。除了关闭流,Close 方法还调用关闭文档所需的所有 WriteEnd<xxx> 方法。
方法对
XmlWriter 中的方法也是成对出现的:WriteStartDocument 与 WriteEndDocument,WriteStartElement 与 WriteEndElement 和 WriteStartAttribute 与 WriteEndAttribute 方法对。例如,使用这些方法可以创建嵌套的元素或属性。用以生成 XML 文档并允许创建复杂元素或属性的就是这些方法对。
WriteStartDocument 与 WriteEndDocument 方法
WriteStartDocument 开始新的文档,并写出 XML 声明,版本属性设置为“1.0”,WriteEndDocument 关闭该文档。在调用下一个 WriteStartDocument 以开始写出下一个文档之间,可以修改格式设置、缩进和其他属性。WriteStartDocument 方法以编程方式识别出正在写出 XML 文档并应用根级别规则。如果不使用该方法,则将创建 XML 片段并验证它的格式是否正确。不应用根级别规则。下面的代码示例显示文档的开头和结尾。
' Write the XML declaration.writer.WriteStartDocument()
...
'Close the document.writer.WriteEndDocument()
// Write the XML declaration.writer.WriteStartDocument();
...// Close the document.writer.WriteEndDocument();
WriteStartElement 与 WriteEndElement 方法
WriteStartElement 与 WriteEndElement 对分隔一个或多个元素。在所有被重写的 WriteStartElement 方法中,开始标记的本地名称是必选参数。下面的代码使用 WriteStartElement 与 WriteEndElement 方法对。
' Write the title.writer.WriteStartElement("title")
writer.WriteString("The Handmaid's Tale")
writer.WriteEndElement()
// Write the title.writer.WriteStartElement("title");
writer.WriteString("The Handmaid's Tale");
writer.WriteEndElement();
输出
<title>The Handmaid's Tale</title>
WriteStartElement 提供一个重写的方法签名,该签名使代码能够为其元素指定命名空间前缀。有关更多信息,请参见 XmlTextWriter 中的元素命名空间前缀。
WriteStartAttribute 与 WriteEndAttribute 方法
WriteStartAttribute 与 WriteEndAttribute 类似于其他开始和结束方法,只是这两个方法开始和结束属性。WriteStartAttribute 写出属性的开始,WriteString 方法用于写出属性值,WriteEndAttribute 结束属性标记。下面的代码示例显示 WriteStartAttribute 与 WriteEndAttribute 方法对。
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
writer.WriteString("1-861003-78")
writer.WriteEndAttribute()
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");
writer.WriteString("1-861003-78");
writer.WriteEndAttribute();
输出
<book bk:ISBN="1-861003-78">
WriteStartAttribute 具有一个重载方法,该方法使应用程序能够指定命名空间前缀,以便可以将命名空间前缀与所写出的属性关联。有关更多信息,请参见 XmlTextWriter 中的属性命名空间前缀。