Export (0) Print
Expand All

XmlWriter Class

Represents a writer that provides a fast, non-cached, forward-only means of generating streams or files containing XML data that conforms to the W3C Extensible Markup Language (XML) 1.0 and the Namespaces in XML recommendations.

For a list of all members of this type, see XmlWriter Members.

System.Object
   System.Xml.XmlWriter
      System.Xml.XmlTextWriter

[Visual Basic]
MustInherit Public Class XmlWriter
[C#]
public abstract class XmlWriter
[C++]
public __gc __abstract class XmlWriter
[JScript]
public abstract class XmlWriter

Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Remarks

XmlWriter is implemented in the XmlTextWriter class.

XmlWriter maintains a namespace stack corresponding to all the namespaces defined in the current element stack. Using XmlWriter you can declare namespaces manually.

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();

The above C# code produces the following output. XmlWriter promotes the namespace declaration to the root element to avoid having it duplicated on the two child elements. The child elements pick up the prefix from the namespace declaration.

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

XmlWriter also allows you to override the current namespace declaration. In the following example the namespace URI "123" is overridden by "abc" to produce the XML element <x:node xmlns:x="abc"/>.

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

By using the write methods that take a prefix as an argument you can also specify which prefix to use. In the following example, two different prefixes are mapped to the same namespace URI to produce the XML text <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();

If there are multiple namespace declarations mapping different prefixes to the same namespace URI, XmlWriter walks the stack of namespace declarations backwards and picks the closest one.

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();

In the above C# example, because the WriteAttributeString call does not specify a prefix, the writer uses the last prefix pushed onto the namespace stack, and produces the following XML:

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

If namespace conflicts occur, XmlWriter resolves them by generating alternate prefixes. For example, if an attribute and element have the same prefix but different namespaces, XmlWriter generates an alternate prefix for the attribute. The generated prefixes are named n{i} where i is a number beginning at 1. The number is reset to 1 for each element.

Attributes which are associated with a namespace URI must have a prefix (default namespaces do not apply to attributes). This conforms to section 5.2 of the W3C Namespaces in XML recommendation. If an attribute references a namespace URI, but does not specify a prefix, the writer generates a prefix for the attribute.

When writing an empty element, an additional space is added between tag name and the closing tag, for example <item />. This provides compatibility with older browsers.

When a String is used as method parameter, a null reference (Nothing in Visual Basic) and String.Empty are equivalent. String.Empty follows the W3C rules.

To write strongly typed data, use the XmlConvert class to convert data types to string. For example, the following C# code converts the data from Double to String and writes the element <price>19.95</price>.

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

XmlWriter does not check for the following:

  • Invalid characters in attribute and element names.
  • Unicode characters that do not fit the specified encoding. If the Unicode characters do not fit the specified encoding, the XmlWriter does not escape the Unicode characters into character entities.
  • Duplicate attributes.
  • Characters in the DOCTYPE public identifier or system identifier.

For more information on writing XML, see Writing XML with the XmlWriter.

Requirements

Namespace: System.Xml

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family, .NET Compact Framework

Assembly: System.Xml (in System.Xml.dll)

See Also

XmlWriter Members | System.Xml Namespace

Was this page helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2014 Microsoft