XmlWriter Class
Definition
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Represents a writer that provides a fast, non-cached, forward-only way to generate streams or files that contain XML data.
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
- Inheritance
-
XmlWriter
- Derived
- Implements
Examples
The following example code shows how to use the asynchronous API to generate 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();
}
}
Remarks
The XmlWriter class writes XML data to a stream, file, text reader, or string. It supports the W3C Extensible Markup Language (XML) 1.0 (fourth edition) and Namespaces in XML 1.0 (third edition) recommendations.
The members of the XmlWriter class enable you to:
Verify that the characters are legal XML characters and that element and attribute names are valid XML names.
Verify that the XML document is well-formed.
Encode binary bytes as Base64 or BinHex, and write out the resulting text.
Pass values by using common language runtime types instead of strings, to avoid having to manually perform value conversions.
Write multiple documents to one output stream.
Write valid names, qualified names, and name tokens.
In this section:
Creating an XML writer
Specifying the output format
Data conformance
Writing elements
Writing attributes
Handling namespaces
Writing typed data
Closing the XML writer
Asynchronous programming
Security considerations
Creating an XML writer
To create an XmlWriter instance, use the XmlWriter.Create method. To specify the set of features you want to enable on the XML writer, pass an XmlWriterSettings to the Create method. Otherwise, default settings are used. See the Create reference pages for details.
Specifying the output format
The XmlWriterSettings class includes several properties that control how XmlWriter output is formatted:
Property | Description |
---|---|
Encoding | Specifies the text encoding to use. The default is Encoding.UTF8 . |
Indent | Indicates whether to indent elements. The default is false (no indentation). |
IndentChars | Specifies the character string to use when indenting. The default is two spaces. |
NewLineChars | Specifies the character string to use for line breaks. The default is \r\n (carriage return, line feed) for non-Unix platforms, and \n (line feed) for Unix platforms. |
NewLineHandling | Specifies how to handle newline characters. |
NewLineOnAttributes | Indicates whether to write attributes on a new line. Indent should be set to true when using this property. The default is false . |
OmitXmlDeclaration | Indicates whether to write an XML declaration. The default is false . |
The Indent and IndentChars properties control how insignificant white space is formatted. For example, to indent element nodes:
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)
Use the NewLineOnAttributes to write each attribute on a new line with one extra level of indentation:
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)
Data conformance
An XML writer uses two properties from the XmlWriterSettings class to check for data conformance:
The CheckCharacters property instructs the XML writer to check characters and throw an XmlException exception if any characters are outside the legal range, as defined by the W3C.
The ConformanceLevel property configures the XML writer to check that the stream being written complies with the rules for a well-formed XML 1.0 document or document fragment, as defined by the W3C. The three conformance levels are described in the following table. The default is Document. For details, see the XmlWriterSettings.ConformanceLevel property and the System.Xml.ConformanceLevel enumeration.
Level Description Document The XML output conforms to the rules for a well-formed XML 1.0 document and can be processed by any conforming processor. Fragment The XML output conforms to the rules for a well-formed XML 1.0 document fragment. Auto The XML writer determines which level of conformation checking to apply (document or fragment) based on the incoming data.
Writing elements
You can use the following XmlWriter methods to write element nodes. For examples, see the methods listed.
Use | To |
---|---|
WriteElementString | Write an entire element node, including a string value. |
WriteStartElement | To write an element value by using multiple method calls. For example, you can call WriteValue to write a typed value, WriteCharEntity to write a character entity, WriteAttributeString to write an attribute, or you can write a child element. This is a more sophisticated version of the WriteElementString method. To close the element, you call the WriteEndElement or WriteFullEndElement method. |
WriteNode | To copy an element node found at the current position of an XmlReader or XPathNavigator object. When called, it copies everything from the source object to the XmlWriter instance. |
Writing attributes
You can use the following XmlWriter methods to write attributes on element nodes. These methods can also be used to create namespace declarations on an element, as discussed in the next section.
Use | To |
---|---|
WriteAttributeString | To write an entire attribute node, including a string value. |
WriteStartAttribute | To write the attribute value using multiple method calls. For example, you can call WriteValue to write a typed value. This is a more sophisticated version of the WriteElementString method. To close the element, you call the WriteEndAttribute method. |
WriteAttributes | To copy all the attributes found at the current position of an XmlReader object. The attributes that are written depend on the type of node the reader is currently positioned on: - For an attribute node, it writes the current attribute, and then the rest of the attributes until the element closing tag. - For an element node, it writes all attributes contained by the element. - For an XML declaration node, it writes all the attributes in the declaration. - For all other node types, the method throws an exception. |
Handling namespaces
Namespaces are used to qualify element and attribute names in an XML document. Namespace prefixes associate elements and attributes with namespaces, which are in turn associated with URI references. Namespaces create element and attribute name uniqueness in an XML document.
The XmlWriter maintains a namespace stack that corresponds to all the namespaces defined in the current namespace scope. When writing elements and attributes you can utilize namespaces in the following ways:
Declare namespaces manually by using the WriteAttributeString method. This can be useful when you know how to best optimize the number of namespace declarations. For an example, see the WriteAttributeString(String, String, String, String) method.
Override the current namespace declaration with a new namespace. In the following code, the WriteAttributeString method changes the namespace URI for the
"x"
prefix from"123"
to"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()
The code generates the following XML string:
<x:root xmlns:x="123"> <item xmlns:x="abc" /> </x:root>
Specify a namespace prefix when writing attributes or elements. Many of the methods used to write element and attributes enable you to do this. For example, the WriteStartElement(String, String, String) method writes a start tag and associates it with a specified namespace and prefix.
Writing typed data
The WriteValue method accepts a common language runtime (CLR) object, converts the input value to its string representation according to XML schema definition language (XSD) data type conversion rules, and writes it out by using the WriteString method. This is easier than using the methods in the XmlConvert class to convert the typed data to a string value before writing it out.
When writing to text, the typed value is serialized to text by using the XmlConvert rules for that schema type.
For default XSD data types that correspond to CLR types, see the WriteValue method.
The XmlWriter can also be used to write to an XML data store. For example, the XPathNavigator class can create an XmlWriter object to create nodes for an XmlDocument object. If the data store has schema information available to it, the WriteValue method throws an exception if you try to convert to a type that is not allowed. If the data store does not have schema information available to it, the WriteValue method treats all values as an xsd:anySimpleType
type.
Closing the XML writer
When you use XmlWriter methods to output XML, the elements and attributes are not written until you call the Close method. For example, if you are using XmlWriter to populate an XmlDocument object, you won't be able to see the written elements and attributes in the target document until you close the XmlWriter instance.
Asynchronous programming
Most of the XmlWriter methods have asynchronous counterparts that have "Async" at the end of their method names. For example, the asynchronous equivalent of WriteAttributeString is WriteAttributeStringAsync.
For the WriteValue method, which doesn't have an asynchronous counterpart, convert the return value to a string and use the WriteStringAsync method instead.
Security considerations
Consider the following when working with the XmlWriter class:
Exceptions thrown by the XmlWriter can disclose path information that you do not want bubbled up to the app. Your app must catch exceptions and process them appropriately.
XmlWriter does not validate any data that is passed to the WriteDocType or WriteRaw method. You should not pass arbitrary data to these methods.
Constructors
XmlWriter() |
Initializes a new instance of the XmlWriter class. |
Properties
Settings |
Gets the XmlWriterSettings object used to create this XmlWriter instance. |
WriteState |
When overridden in a derived class, gets the state of the writer. |
XmlLang |
When overridden in a derived class, gets the current |
XmlSpace |
When overridden in a derived class, gets an XmlSpace representing the current |
Methods
Close() |
When overridden in a derived class, closes this stream and the underlying stream. |
Create(Stream) |
Creates a new XmlWriter instance using the specified stream. |
Create(Stream, XmlWriterSettings) |
Creates a new XmlWriter instance using the stream and XmlWriterSettings object. |
Create(String) |
Creates a new XmlWriter instance using the specified filename. |
Create(String, XmlWriterSettings) |
Creates a new XmlWriter instance using the filename and XmlWriterSettings object. |
Create(StringBuilder) |
Creates a new XmlWriter instance using the specified StringBuilder. |
Create(StringBuilder, XmlWriterSettings) |
Creates a new XmlWriter instance using the StringBuilder and XmlWriterSettings objects. |
Create(TextWriter) |
Creates a new XmlWriter instance using the specified TextWriter. |
Create(TextWriter, XmlWriterSettings) |
Creates a new XmlWriter instance using the TextWriter and XmlWriterSettings objects. |
Create(XmlWriter) |
Creates a new XmlWriter instance using the specified XmlWriter object. |
Create(XmlWriter, XmlWriterSettings) |
Creates a new XmlWriter instance using the specified XmlWriter and XmlWriterSettings objects. |
Dispose() |
Releases all resources used by the current instance of the XmlWriter class. |
Dispose(Boolean) |
Releases the unmanaged resources used by the XmlWriter and optionally releases the managed resources. |
DisposeAsync() |
Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources asynchronously. |
DisposeAsyncCore() |
Performs application-defined tasks associated with freeing, releasing, or resetting managed resources asynchronously. |
Equals(Object) |
Determines whether the specified object is equal to the current object. (Inherited from Object) |
Flush() |
When overridden in a derived class, flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. |
FlushAsync() |
Asynchronously flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. |
GetHashCode() |
Serves as the default hash function. (Inherited from Object) |
GetType() |
Gets the Type of the current instance. (Inherited from Object) |
LookupPrefix(String) |
When overridden in a derived class, returns the closest prefix defined in the current namespace scope for the namespace URI. |
MemberwiseClone() |
Creates a shallow copy of the current Object. (Inherited from Object) |
ToString() |
Returns a string that represents the current object. (Inherited from Object) |
WriteAttributes(XmlReader, Boolean) |
When overridden in a derived class, writes out all the attributes found at the current position in the XmlReader. |
WriteAttributesAsync(XmlReader, Boolean) |
Asynchronously writes out all the attributes found at the current position in the XmlReader. |
WriteAttributeString(String, String) |
When overridden in a derived class, writes out the attribute with the specified local name and value. |
WriteAttributeString(String, String, String) |
When overridden in a derived class, writes an attribute with the specified local name, namespace URI, and value. |
WriteAttributeString(String, String, String, String) |
When overridden in a derived class, writes out the attribute with the specified prefix, local name, namespace URI, and value. |
WriteAttributeStringAsync(String, String, String, String) |
Asynchronously writes out the attribute with the specified prefix, local name, namespace URI, and value. |
WriteBase64(Byte[], Int32, Int32) |
When overridden in a derived class, encodes the specified binary bytes as Base64 and writes out the resulting text. |
WriteBase64Async(Byte[], Int32, Int32) |
Asynchronously encodes the specified binary bytes as Base64 and writes out the resulting text. |
WriteBinHex(Byte[], Int32, Int32) |
When overridden in a derived class, encodes the specified binary bytes as |
WriteBinHexAsync(Byte[], Int32, Int32) |
Asynchronously encodes the specified binary bytes as |
WriteCData(String) |
When overridden in a derived class, writes out a <![CDATA[...]]> block containing the specified text. |
WriteCDataAsync(String) |
Asynchronously writes out a <![CDATA[...]]> block containing the specified text. |
WriteCharEntity(Char) |
When overridden in a derived class, forces the generation of a character entity for the specified Unicode character value. |
WriteCharEntityAsync(Char) |
Asynchronously forces the generation of a character entity for the specified Unicode character value. |
WriteChars(Char[], Int32, Int32) |
When overridden in a derived class, writes text one buffer at a time. |
WriteCharsAsync(Char[], Int32, Int32) |
Asynchronously writes text one buffer at a time. |
WriteComment(String) |
When overridden in a derived class, writes out a comment <!--...--> containing the specified text. |
WriteCommentAsync(String) |
Asynchronously writes out a comment <!--...--> containing the specified text. |
WriteDocType(String, String, String, String) |
When overridden in a derived class, writes the DOCTYPE declaration with the specified name and optional attributes. |
WriteDocTypeAsync(String, String, String, String) |
Asynchronously writes the DOCTYPE declaration with the specified name and optional attributes. |
WriteElementString(String, String) |
Writes an element with the specified local name and value. |
WriteElementString(String, String, String) |
Writes an element with the specified local name, namespace URI, and value. |
WriteElementString(String, String, String, String) |
Writes an element with the specified prefix, local name, namespace URI, and value. |
WriteElementStringAsync(String, String, String, String) |
Asynchronously writes an element with the specified prefix, local name, namespace URI, and value. |
WriteEndAttribute() |
When overridden in a derived class, closes the previous WriteStartAttribute(String, String) call. |
WriteEndAttributeAsync() |
Asynchronously closes the previous WriteStartAttribute(String, String) call. |
WriteEndDocument() |
When overridden in a derived class, closes any open elements or attributes and puts the writer back in the Start state. |
WriteEndDocumentAsync() |
Asynchronously closes any open elements or attributes and puts the writer back in the Start state. |
WriteEndElement() |
When overridden in a derived class, closes one element and pops the corresponding namespace scope. |
WriteEndElementAsync() |
Asynchronously closes one element and pops the corresponding namespace scope. |
WriteEntityRef(String) |
When overridden in a derived class, writes out an entity reference as |
WriteEntityRefAsync(String) |
Asynchronously writes out an entity reference as |
WriteFullEndElement() |
When overridden in a derived class, closes one element and pops the corresponding namespace scope. |
WriteFullEndElementAsync() |
Asynchronously closes one element and pops the corresponding namespace scope. |
WriteName(String) |
When overridden in a derived class, writes out the specified name, ensuring it is a valid name according to the W3C XML 1.0 recommendation (https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name). |
WriteNameAsync(String) |
Asynchronously writes out the specified name, ensuring it is a valid name according to the W3C XML 1.0 recommendation (https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name). |
WriteNmToken(String) |
When overridden in a derived class, writes out the specified name, ensuring it is a valid NmToken according to the W3C XML 1.0 recommendation (https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name). |
WriteNmTokenAsync(String) |
Asynchronously writes out the specified name, ensuring it is a valid NmToken according to the W3C XML 1.0 recommendation (https://www.w3.org/TR/1998/REC-xml-19980210#NT-Name). |
WriteNode(XmlReader, Boolean) |
When overridden in a derived class, copies everything from the reader to the writer and moves the reader to the start of the next sibling. |
WriteNode(XPathNavigator, Boolean) |
Copies everything from the XPathNavigator object to the writer. The position of the XPathNavigator remains unchanged. |
WriteNodeAsync(XmlReader, Boolean) |
Asynchronously copies everything from the reader to the writer and moves the reader to the start of the next sibling. |
WriteNodeAsync(XPathNavigator, Boolean) |
Asynchronously copies everything from the XPathNavigator object to the writer. The position of the XPathNavigator remains unchanged. |
WriteProcessingInstruction(String, String) |
When overridden in a derived class, writes out a processing instruction with a space between the name and text as follows: <?name text?>. |
WriteProcessingInstructionAsync(String, String) |
Asynchronously writes out a processing instruction with a space between the name and text as follows: <?name text?>. |
WriteQualifiedName(String, String) |
When overridden in a derived class, writes out the namespace-qualified name. This method looks up the prefix that is in scope for the given namespace. |
WriteQualifiedNameAsync(String, String) |
Asynchronously writes out the namespace-qualified name. This method looks up the prefix that is in scope for the given namespace. |
WriteRaw(Char[], Int32, Int32) |
When overridden in a derived class, writes raw markup manually from a character buffer. |
WriteRaw(String) |
When overridden in a derived class, writes raw markup manually from a string. |
WriteRawAsync(Char[], Int32, Int32) |
Asynchronously writes raw markup manually from a character buffer. |
WriteRawAsync(String) |
Asynchronously writes raw markup manually from a string. |
WriteStartAttribute(String) |
Writes the start of an attribute with the specified local name. |
WriteStartAttribute(String, String) |
Writes the start of an attribute with the specified local name and namespace URI. |
WriteStartAttribute(String, String, String) |
When overridden in a derived class, writes the start of an attribute with the specified prefix, local name, and namespace URI. |
WriteStartAttributeAsync(String, String, String) |
Asynchronously writes the start of an attribute with the specified prefix, local name, and namespace URI. |
WriteStartDocument() |
When overridden in a derived class, writes the XML declaration with the version "1.0". |
WriteStartDocument(Boolean) |
When overridden in a derived class, writes the XML declaration with the version "1.0" and the standalone attribute. |
WriteStartDocumentAsync() |
Asynchronously writes the XML declaration with the version "1.0". |
WriteStartDocumentAsync(Boolean) |
Asynchronously writes the XML declaration with the version "1.0" and the standalone attribute. |
WriteStartElement(String) |
When overridden in a derived class, writes out a start tag with the specified local name. |
WriteStartElement(String, String) |
When overridden in a derived class, writes the specified start tag and associates it with the given namespace. |
WriteStartElement(String, String, String) |
When overridden in a derived class, writes the specified start tag and associates it with the given namespace and prefix. |
WriteStartElementAsync(String, String, String) |
Asynchronously writes the specified start tag and associates it with the given namespace and prefix. |
WriteString(String) |
When overridden in a derived class, writes the given text content. |
WriteStringAsync(String) |
Asynchronously writes the given text content. |
WriteSurrogateCharEntity(Char, Char) |
When overridden in a derived class, generates and writes the surrogate character entity for the surrogate character pair. |
WriteSurrogateCharEntityAsync(Char, Char) |
Asynchronously generates and writes the surrogate character entity for the surrogate character pair. |
WriteValue(Boolean) |
Writes a Boolean value. |
WriteValue(DateTime) |
Writes a DateTime value. |
WriteValue(DateTimeOffset) |
Writes a DateTimeOffset value. |
WriteValue(Decimal) |
Writes a Decimal value. |
WriteValue(Double) |
Writes a Double value. |
WriteValue(Int32) |
Writes a Int32 value. |
WriteValue(Int64) |
Writes a Int64 value. |
WriteValue(Object) |
Writes the object value. |
WriteValue(Single) |
Writes a single-precision floating-point number. |
WriteValue(String) |
Writes a String value. |
WriteWhitespace(String) |
When overridden in a derived class, writes out the given white space. |
WriteWhitespaceAsync(String) |
Asynchronously writes out the given white space. |
Explicit Interface Implementations
IDisposable.Dispose() |
For a description of this member, see Dispose(). |
Extension Methods
ConfigureAwait(IAsyncDisposable, Boolean) |
Configures how awaits on the tasks returned from an async disposable are performed. |