XmlWriter 类

定义

表示一个编写器,该编写器提供快速、非缓存的仅向前方式来生成包含 XML 数据的流或文件。

public ref class XmlWriter abstract : IDisposable
public ref class XmlWriter abstract : IAsyncDisposable, IDisposable
public ref class XmlWriter abstract
public abstract class XmlWriter : IDisposable
public abstract class XmlWriter : IAsyncDisposable, IDisposable
public abstract class XmlWriter
type XmlWriter = class
    interface IDisposable
type XmlWriter = class
    interface IAsyncDisposable
    interface IDisposable
type XmlWriter = class
Public MustInherit Class XmlWriter
Implements IDisposable
Public MustInherit Class XmlWriter
Implements IAsyncDisposable, IDisposable
Public MustInherit Class XmlWriter
继承
XmlWriter
派生
实现

示例

以下示例代码演示如何使用异步 API 生成 XML。

async Task TestWriter(Stream stream)
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Async = true;

    using (XmlWriter writer = XmlWriter.Create(stream, settings)) {
        await writer.WriteStartElementAsync("pf", "root", "http://ns");
        await writer.WriteStartElementAsync(null, "sub", null);
        await writer.WriteAttributeStringAsync(null, "att", null, "val");
        await writer.WriteStringAsync("text");
        await writer.WriteEndElementAsync();
        await writer.WriteProcessingInstructionAsync("pName", "pValue");
        await writer.WriteCommentAsync("cValue");
        await writer.WriteCDataAsync("cdata value");
        await writer.WriteEndElementAsync();
        await writer.FlushAsync();
    }
}

注解

XmlWriter 类将 XML 数据写入流、文件、文本或字符串。 它支持 XML 1.0(第四版)XML 1.0(第三版)建议中的 W3C 可扩展标记语言(XML)和命名空间。

XmlWriter 类的成员使你能够:

  • 验证这些字符是否为合法的 XML 字符,以及元素和属性名称是否为有效的 XML 名称。
  • 验证 XML 文档的格式正确。
  • 将二进制字节编码为 Base64 或 BinHex,并写出生成的文本。
  • 使用公共语言运行时类型而不是字符串传递值,以避免必须手动执行值转换。
  • 将多个文档写入一个输出流。
  • 编写有效名称、限定名称和名称标记。

创建 XML 编写器

若要创建 XmlWriter 实例,请使用该方法 XmlWriter.Create 。 若要指定要在 XML 编写器上启用的功能集,请向XmlWriterSettings该方法传递一个Create。 否则,将使用默认设置。 请参阅 Create 参考页以了解详细信息。

指定输出格式

XmlWriterSettings 类包括多个属性,用于控制 XmlWriter 输出的格式:

财产 Description
Encoding 指定要使用的文本编码。 默认值为 Encoding.UTF8
Indent 指示是否使元素缩进。 默认值为 false (无缩进)。
IndentChars 指定在缩进时要使用的字符串。 默认值为两个空格。
NewLineChars 指定要用于换行符的字符串。 非 Unix 平台的默认设置是 \r\n(回车符和换行符),而 Unix 平台的默认设置是 \n(换行符)。
NewLineHandling 指定如何处理换行符。
NewLineOnAttributes 指示是否在新行上写入属性。 Indent 应在使用此属性时设置为 true。 默认值为 false
OmitXmlDeclaration 指示是否编写 XML 声明。 默认值为 false

IndentIndentChars 属性控制如何格式化无关紧要的空白。 例如,要缩进元素节点:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = "\t";
XmlWriter writer = XmlWriter.Create("books.xml", settings);
Dim settings As New XmlWriterSettings()
settings.Indent = True
settings.IndentChars = vbTab
Dim writer As XmlWriter = XmlWriter.Create("books.xml", settings)

使用 NewLineOnAttributes 将每个属性写入新行,并增加一层缩进:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
XmlWriter writer = XmlWriter.Create("books.xml", settings);
Dim settings As New XmlWriterSettings()
settings.Indent = True
settings.NewLineOnAttributes = True
Dim writer As XmlWriter = XmlWriter.Create("books.xml", settings)

数据一致性

XML 编写器使用类中的 XmlWriterSettings 两个属性来检查数据符合性:

  • CheckCharacters 属性指示 XML 编写器检查字符,并在任何字符超出 W3C 定义的法律范围之外时引发 XmlException 异常。

  • ConformanceLevel 属性将 XML 编写器配置为检查所编写的流是否符合由 W3C 定义的格式正确的 XML 1.0 文档或文档片段的规则。 下表描述了这三个一致性级别。 默认值为 Document。 有关详细信息,请参阅 XmlWriterSettings.ConformanceLevel 属性和 System.Xml.ConformanceLevel 枚举。

    Level Description
    Document XML 输出符合格式正确的 XML 1.0 文档的规则,并且可由任何符合要求的处理器进行处理。
    Fragment XML 输出符合格式正确的 XML 1.0 文档片段的规则。
    Auto XML 编写器根据传入数据确定要应用(文档或片段)的符合性检查级别。

写入元素

可以使用以下 XmlWriter 方法编写元素节点。 有关示例,请参阅列出的方法。

使用 To
WriteElementString 编写整个元素节点,包括字符串值。
WriteStartElement 要通过使用多个方法调用来写入元素值。 例如,可以调用 WriteValue 编写类型化值、 WriteCharEntity 编写字符实体、 WriteAttributeString 写入属性,也可以编写子元素。 这是该方法的 WriteElementString 更复杂的版本。

若要关闭元素,请调用 WriteEndElementWriteFullEndElement 方法。
WriteNode 复制找到的位于XmlReaderXPathNavigator对象当前位置的元素节点。 调用时,它将所有内容从源对象 XmlWriter 复制到实例。

写入属性

可以使用以下 XmlWriter 方法在元素节点上编写属性。 这些方法还可用于在元素上创建命名空间声明,如下一部分所述。

使用 To
WriteAttributeString 要写入整个属性节点,包括字符串值。
WriteStartAttribute 要通过使用多个方法调用来写入属性值。 例如,可以调用 WriteValue 以编写类型化值。 这是该方法的 WriteElementString 更复杂的版本。

若要关闭元素,请调用 WriteEndAttribute 该方法。
WriteAttributes 复制XmlReader对象当前位置的所有属性。 写入的属性取决于读取器当前定位的节点类型:

- 对于属性节点,它会写入当前属性,然后写入其余属性,直到元素结束标记。
- 对于元素节点,它将写入元素包含的所有属性。
- 对于 XML 声明节点,它将写入声明中的所有属性。
- 对于所有其他节点类型,该方法将引发异常。

处理命名空间

命名空间用于限定 XML 文档中的元素和属性名称。 命名空间前缀将元素和属性与命名空间相关联,这些命名空间又与 URI 引用相关联。 命名空间在 XML 文档中创建元素和属性名称唯一性。

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

  • 使用 WriteAttributeString 该方法手动声明命名空间。 当你知道如何最好地优化命名空间声明的数量时,这非常有用。 有关示例,请参阅 WriteAttributeString(String, String, String, String) 方法。

  • 用新的命名空间重写当前命名空间声明。 在以下代码中,该方法 WriteAttributeString 将前缀的 "x" 命名空间 URI 从 "123" 更改为 "abc"

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

    该代码生成以下 XML 字符串:

    <x:root xmlns:x="123">
      <item xmlns:x="abc" />
    </x:root>
    
  • 编写属性或元素时指定命名空间前缀。 许多用于编写元素和属性的方法都使你能够执行此作。 例如,该方法 WriteStartElement(String, String, String) 编写一个开始标记,并将其与指定的命名空间和前缀相关联。

写入类型化数据

该方法 WriteValue 接受公共语言运行时 (CLR) 对象,根据 XML 架构定义语言 (XSD) 数据类型转换规则将输入值转换为其字符串表示形式,并使用该方法将其写出 WriteString 。 这比在 XmlConvert 类中使用方法将类型化数据转换为字符串值后再进行编写要容易得多。

写入文本时,使用该架构类型的 XmlConvert 规则将类型化值序列化为文本。

有关对应于 CLR 类型的默认 XSD 数据类型,请参阅该方法 WriteValue

XmlWriter还可用于写入 XML 数据存储。 例如,该 XPathNavigator 类可以创建对象 XmlWriter 以创建对象的 XmlDocument 节点。 如果数据存储具有可用的架构信息,则如果尝试转换为不允许的类型,该方法 WriteValue 将引发异常。 如果数据存储没有可用的架构信息,该方法 WriteValue 会将所有值视为类型 xsd:anySimpleType

关闭 XML 编写器

使用 XmlWriter 方法输出 XML 时,在调用 Close 该方法之前不会写入元素和属性。 例如,如果使用 XmlWriter 填充 XmlDocument 对象,则在关闭 XmlWriter 实例之前,将无法在目标文档中看到写入的元素和属性。

异步编程

大多数XmlWriter方法都有异步对应项,其方法名称的末尾带有“Async”。 例如,异步等效项 WriteAttributeStringWriteAttributeStringAsync.

WriteValue对于没有异步对应项的方法,请将返回值转换为字符串,并改用该方法WriteStringAsync

安全注意事项

使用 XmlWriter 类时,请考虑以下事项:

  • XmlWriter 抛出的异常可能会泄露不希望向上层应用传递的路径信息。 你的应用必须捕获异常并相应地处理它们。

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

构造函数

名称 说明
XmlWriter()

初始化 XmlWriter 类的新实例。

属性

名称 说明
Settings

XmlWriterSettings获取用于创建此XmlWriter实例的对象。

WriteState

在派生类中重写时,获取编写器的状态。

XmlLang

在派生类中重写时,获取当前 xml:lang 范围。

XmlSpace

在派生类中重写时,获取 XmlSpace 表示当前 xml:space 范围。

方法

名称 说明
Close()

在派生类中重写时,关闭此流和基础流。

Create(Stream, XmlWriterSettings)

使用流和XmlWriter对象创建新XmlWriterSettings实例。

Create(Stream)

使用指定的流创建新 XmlWriter 实例。

Create(String, XmlWriterSettings)

使用文件名和XmlWriter对象创建新XmlWriterSettings实例。

Create(String)

使用指定的文件名创建新 XmlWriter 实例。

Create(StringBuilder, XmlWriterSettings)

使用XmlWriterStringBuilder对象创建新XmlWriterSettings实例。

Create(StringBuilder)

使用指定的XmlWriter实例创建一个新StringBuilder实例。

Create(TextWriter, XmlWriterSettings)

使用XmlWriterTextWriter对象创建新XmlWriterSettings实例。

Create(TextWriter)

使用指定的XmlWriter实例创建一个新TextWriter实例。

Create(XmlWriter, XmlWriterSettings)

使用指定XmlWriter对象和XmlWriter对象创建新XmlWriterSettings实例。

Create(XmlWriter)

使用指定的XmlWriter对象创建新XmlWriter实例。

Dispose()

释放类的 XmlWriter 当前实例使用的所有资源。

Dispose(Boolean)

释放由托管资源使用 XmlWriter 的非托管资源,并选择性地释放托管资源。

DisposeAsync()

以异步方式执行与释放、释放或重置非托管资源关联的应用程序定义任务。

DisposeAsyncCore()

以异步方式执行与释放、释放或重置托管资源关联的应用程序定义任务。

Equals(Object)

确定指定的对象是否等于当前对象。

(继承自 Object)
Flush()

在派生类中重写时,将缓冲区中的内容刷新到基础流,并刷新基础流。

FlushAsync()

将缓冲区中的内容异步刷新到基础流,并刷新基础流。

GetHashCode()

用作默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
LookupPrefix(String)

在派生类中重写时,返回在命名空间 URI 的当前命名空间范围内定义的最接近的前缀。

MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
ToString()

返回一个表示当前对象的字符串。

(继承自 Object)
WriteAttributes(XmlReader, Boolean)

在派生类中重写时,写出在当前位置 XmlReader的所有属性。

WriteAttributesAsync(XmlReader, Boolean)

异步写入在当前位置 XmlReader找到的所有属性。

WriteAttributeString(String, String, String, String)

在派生类中重写时,写出具有指定前缀、本地名称、命名空间 URI 和值的属性。

WriteAttributeString(String, String, String)

在派生类中重写时,写入具有指定本地名称、命名空间 URI 和值的属性。

WriteAttributeString(String, String)

在派生类中重写时,写出具有指定本地名称和值的属性。

WriteAttributeStringAsync(String, String, String, String)

以异步方式写出具有指定前缀、本地名称、命名空间 URI 和值的属性。

WriteBase64(Byte[], Int32, Int32)

在派生类中重写时,将指定的二进制字节编码为 Base64,并写出生成的文本。

WriteBase64Async(Byte[], Int32, Int32)

将指定的二进制字节异步编码为 Base64,并写出生成的文本。

WriteBinHex(Byte[], Int32, Int32)

在派生类中重写时,将指定的二进制字节编码为 BinHex 并写出生成的文本。

WriteBinHexAsync(Byte[], Int32, Int32)

异步编码指定的二进制字节, BinHex 并写出生成的文本。

WriteCData(String)

在派生类中重写时,写出一个 <![CDATA]。]> 包含指定文本的块。

WriteCDataAsync(String)

异步写出 <![CDATA]。]> 包含指定文本的块。

WriteCharEntity(Char)

在派生类中重写时,强制为指定的 Unicode 字符值生成字符实体。

WriteCharEntityAsync(Char)

异步强制为指定的 Unicode 字符值生成字符实体。

WriteChars(Char[], Int32, Int32)

在派生类中重写时,一次写入一个缓冲区的文本。

WriteCharsAsync(Char[], Int32, Int32)

一次异步写入一个缓冲区的文本。

WriteComment(String)

在派生类中重写时,写出包含指定文本的注释 <--...--> 。

WriteCommentAsync(String)

异步写出包含指定文本的注释 <--...--> 。

WriteDocType(String, String, String, String)

在派生类中重写时,使用指定的名称和可选属性写入 DOCTYPE 声明。

WriteDocTypeAsync(String, String, String, String)

使用指定的名称和可选属性异步写入 DOCTYPE 声明。

WriteElementString(String, String, String, String)

写入具有指定前缀、本地名称、命名空间 URI 和值的元素。

WriteElementString(String, String, String)

写入具有指定本地名称、命名空间 URI 和值的元素。

WriteElementString(String, String)

写入具有指定本地名称和值的元素。

WriteElementStringAsync(String, String, String, String)

异步写入具有指定前缀、本地名称、命名空间 URI 和值的元素。

WriteEndAttribute()

在派生类中重写时,关闭上一 WriteStartAttribute(String, String) 次调用。

WriteEndAttributeAsync()

异步关闭上一 WriteStartAttribute(String, String) 次调用。

WriteEndDocument()

在派生类中重写时,关闭任何打开的元素或属性,并将编写器重新置于“开始”状态。

WriteEndDocumentAsync()

异步关闭任何打开的元素或属性,并将编写器重新置于“开始”状态。

WriteEndElement()

在派生类中重写时,关闭一个元素并弹出相应的命名空间范围。

WriteEndElementAsync()

异步关闭一个元素并弹出相应的命名空间范围。

WriteEntityRef(String)

在派生类中重写时,将实体引用写出为 &name;.

WriteEntityRefAsync(String)

以异步方式将实体引用写出为 &name;.

WriteFullEndElement()

在派生类中重写时,关闭一个元素并弹出相应的命名空间范围。

WriteFullEndElementAsync()

异步关闭一个元素并弹出相应的命名空间范围。

WriteName(String)

在派生类中重写时,写出指定的名称,确保它根据 W3C XML 1.0 建议(https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name) 是有效的名称。

WriteNameAsync(String)

异步写出指定名称,确保它根据 W3C XML 1.0 建议(https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name) 是有效的名称。

WriteNmToken(String)

在派生类中重写时,写出指定的名称,确保它根据 W3C XML 1.0 建议(https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name)是有效的 NmToken。

WriteNmTokenAsync(String)

根据 W3C XML 1.0 建议https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name()异步写出指定名称,确保它是有效的 NmToken。

WriteNode(XmlReader, Boolean)

在派生类中重写时,将读取器的所有内容复制到编写器,并将读取器移动到下一个兄弟姐妹的开头。

WriteNode(XPathNavigator, Boolean)

将对象的所有内容 XPathNavigator 复制到编写器。 该位置 XPathNavigator 保持不变。

WriteNodeAsync(XmlReader, Boolean)

将读取器的所有内容异步复制到编写器,并将读取器移动到下一个同级级的开头。

WriteNodeAsync(XPathNavigator, Boolean)

将对象中 XPathNavigator 的所有内容异步复制到编写器。 该位置 XPathNavigator 保持不变。

WriteProcessingInstruction(String, String)

在派生类中重写时,写出名称与文本之间的空格的处理指令,如下所示: <“name text?”>。

WriteProcessingInstructionAsync(String, String)

异步写出名称与文本之间的空格的处理指令,如下所示:<“名称文本”。>

WriteQualifiedName(String, String)

在派生类中重写时,写出命名空间限定的名称。 此方法查找位于给定命名空间范围内的前缀。

WriteQualifiedNameAsync(String, String)

异步写出命名空间限定的名称。 此方法查找位于给定命名空间范围内的前缀。

WriteRaw(Char[], Int32, Int32)

在派生类中重写时,从字符缓冲区手动写入原始标记。

WriteRaw(String)

在派生类中重写时,从字符串手动写入原始标记。

WriteRawAsync(Char[], Int32, Int32)

从字符缓冲区手动异步写入原始标记。

WriteRawAsync(String)

从字符串中手动异步写入原始标记。

WriteStartAttribute(String, String, String)

在派生类中重写时,使用指定的前缀、本地名称和命名空间 URI 写入属性的开头。

WriteStartAttribute(String, String)

写入具有指定本地名称和命名空间 URI 的属性的开头。

WriteStartAttribute(String)

写入具有指定本地名称的属性的开头。

WriteStartAttributeAsync(String, String, String)

异步写入具有指定前缀、本地名称和命名空间 URI 的属性的开头。

WriteStartDocument()

在派生类中重写时,使用版本“1.0”编写 XML 声明。

WriteStartDocument(Boolean)

在派生类中重写时,使用版本“1.0”和独立属性写入 XML 声明。

WriteStartDocumentAsync()

使用版本“1.0”异步写入 XML 声明。

WriteStartDocumentAsync(Boolean)

使用版本“1.0”和独立属性异步写入 XML 声明。

WriteStartElement(String, String, String)

在派生类中重写时,写入指定的开始标记并将其与给定的命名空间和前缀相关联。

WriteStartElement(String, String)

在派生类中重写时,写入指定的开始标记并将其与给定命名空间相关联。

WriteStartElement(String)

在派生类中重写时,写出具有指定本地名称的起始标记。

WriteStartElementAsync(String, String, String)

异步写入指定的开始标记,并将其与给定的命名空间和前缀相关联。

WriteString(String)

在派生类中重写时,写入给定的文本内容。

WriteStringAsync(String)

异步写入给定的文本内容。

WriteSurrogateCharEntity(Char, Char)

在派生类中重写时,生成并写入代理项字符对的代理项字符实体。

WriteSurrogateCharEntityAsync(Char, Char)

异步生成和写入代理项字符对的代理项字符实体。

WriteValue(Boolean)

写入值 Boolean

WriteValue(DateTime)

写入值 DateTime

WriteValue(DateTimeOffset)

写入值 DateTimeOffset

WriteValue(Decimal)

写入值 Decimal

WriteValue(Double)

写入值 Double

WriteValue(Int32)

写入值 Int32

WriteValue(Int64)

写入值 Int64

WriteValue(Object)

写入对象值。

WriteValue(Single)

写入单精度浮点数。

WriteValue(String)

写入值 String

WriteWhitespace(String)

在派生类中重写时,写出给定的空格。

WriteWhitespaceAsync(String)

异步写出给定的空格。

显式接口实现

名称 说明
IDisposable.Dispose()

有关此成员的说明,请参阅 Dispose()

扩展方法

名称 说明
ConfigureAwait(IAsyncDisposable, Boolean)

配置如何执行从异步可释放项返回的任务的 await。

适用于

另请参阅