public class XmlTextReader : XmlReader, IXmlLineInfo
|
This class implements XmlReader and conforms to the W3C Extensible Markup Language (XML) 1.0 and the Namespaces in XML recommendations.XmlTextReader provides the following functionality:
Because the XmlTextReader does not perform the extra checks required for data validation, it provides a fast well-formedness parser.
To perform data validation, use XmlValidatingReader.
To read XML data from an XmlDocument, use XmlNodeReader.
To read strongly typed data, use the XmlConvert class. For example, the following C# code reads in data and converts it from a String to a Double.
Double price = XmlConvert.ToDouble(reader.Value);
XmlTextReader throws an XmlException on XML parse errors. After an exception is thrown the state of the reader is not predictable. For example, the reported node type may be different than the actual node type of the current node.
For further discussion on the XmlReader classes, see the conceptual topic at MSDN: readingxmlwithxmlreader.
ctor #2 | Overloaded:.ctor(Stream input) Initializes a new instance of the XmlTextReader class with the specified stream. |
ctor #3 | Overloaded:.ctor(string url) Initializes a new instance of the XmlTextReader class with the specified file. |
ctor #4 | Overloaded:.ctor(TextReader input) Initializes a new instance of the XmlTextReader class with the specified TextReader. |
ctor #6 | Overloaded:.ctor(Stream input, XmlNameTable nt) Initializes a new instance of the XmlTextReader class with the specified stream and XmlNameTable. |
ctor #7 | Overloaded:.ctor(string url, Stream input) Initializes a new instance of the XmlTextReader class with the specified URL and stream. |
ctor #8 | Overloaded:.ctor(string url, TextReader input) Initializes a new instance of the XmlTextReader class with the specified URL and TextReader. |
ctor #9 | Overloaded:.ctor(string url, XmlNameTable nt) Initializes a new instance of the XmlTextReader class with the specified file and XmlNameTable. |
ctor #10 | Overloaded:.ctor(TextReader input, XmlNameTable nt) Initializes a new instance of the XmlTextReader class with the specified TextReader and XmlNameTable. |
ctor #11 | Overloaded:.ctor(Stream xmlFragment, XmlNodeType fragType, XmlParserContext context) Initializes a new instance of the XmlTextReader class with the specified values. |
ctor #12 | Overloaded:.ctor(string url, Stream input, XmlNameTable nt) Initializes a new instance of the XmlTextReader class with the specified URL, stream and XmlNameTable. |
ctor #13 | Overloaded:.ctor(string url, TextReader input, XmlNameTable nt) Initializes a new instance of the XmlTextReader class with the specified URL, TextReader and XmlNameTable. |
ctor #14 | Overloaded:.ctor(string xmlFragment, XmlNodeType fragType, XmlParserContext context) Initializes a new instance of the XmlTextReader class with the specified values. |
AttributeCount | Read-only Overridden: Gets the number of attributes on the current node. |
BaseURI | Read-only Overridden: Gets the base URI of the current node. |
CanResolveEntity (inherited from System.Xml.XmlReader) |
Read-only See base class member description: System.Xml.XmlReader.CanResolveEntity Gets a value indicating whether this reader can parse and resolve entities. |
Depth | Read-only Overridden: Gets the depth of the current node in the XML document. |
Encoding | Read-only Gets the encoding of the document. |
EOF | Read-only Overridden: Gets a value indicating whether the reader is positioned at the end of the stream. |
HasAttributes (inherited from System.Xml.XmlReader) |
Read-only See base class member description: System.Xml.XmlReader.HasAttributes Gets a value indicating whether the current node has any attributes. |
HasValue | Read-only Overridden: Gets a value indicating whether the current node can have a XmlTextReader.Value. |
IsDefault | Read-only Overridden: Gets a value indicating whether the current node is an attribute that was generated from the default value defined in the DTD or schema. |
IsEmptyElement | Read-only Overridden: Gets a value indicating whether the current node is an empty element (for example,
<MyElement/>
). |
Item | Read-only Overloaded: Item[int i] {get Overridden: Gets the value of the attribute with the specified index. |
Item | Read-only Overloaded: Item[string name] {get Overridden: Gets the value of the attribute with the specified name. |
Item | Read-only Overloaded: Item[string name, string namespaceURI] {get Overridden: Gets the value of the attribute with the specified local name and namespace URI. |
LineNumber | Read-only Gets the current line number. |
LinePosition | Read-only Gets the current line position. |
LocalName | Read-only Overridden: Gets the local name of the current node. |
Name | Read-only Overridden: Gets the qualified name of the current node. |
Namespaces | Read-write Gets or sets a value indicating whether to do namespace support. |
NamespaceURI | Read-only Overridden: Gets the namespace URI (as defined in the W3C Namespace specification) of the node on which the reader is positioned. |
NameTable | Read-only Overridden: Gets the XmlNameTable associated with this implementation. |
NodeType | Read-only Overridden: Gets the type of the current node. |
Normalization | Read-write Gets or sets a value indicating whether to normalize white space and attribute values. |
Prefix | Read-only Overridden: Gets the namespace prefix associated with the current node. |
QuoteChar | Read-only Overridden: Gets the quotation mark character used to enclose the value of an attribute node. |
ReadState | Read-only Overridden: Gets the state of the reader. |
Value | Read-only Overridden: Gets the text value of the current node. |
WhitespaceHandling | Read-write Gets or sets a value that specifies how white space is handled. |
XmlLang | Read-only Overridden: Gets the current xml:lang scope. |
XmlResolver | Write-only Sets the XmlResolver used for resolving DTD references. |
XmlSpace | Read-only Overridden: Gets the current xml:space scope. |
Close | Overridden: Changes the XmlReader.ReadState to Closed. |
Equals (inherited from System.Object) |
See base class member description: System.Object.Equals Derived from System.Object, the primary base class for all objects. |
GetAttribute | Overloaded:GetAttribute(int i) Overridden: Gets the value of the attribute with the specified index. |
GetAttribute | Overloaded:GetAttribute(string name) Overridden: Gets the value of the attribute with the specified name. |
GetAttribute | Overloaded:GetAttribute(string localName, string namespaceURI) Overridden: Gets the value of the attribute with the specified local name and namespace URI. |
GetHashCode (inherited from System.Object) |
See base class member description: System.Object.GetHashCode Derived from System.Object, the primary base class for all objects. |
GetRemainder | Gets the remainder of the buffered XML. |
GetType (inherited from System.Object) |
See base class member description: System.Object.GetType Derived from System.Object, the primary base class for all objects. |
IsStartElement (inherited from System.Xml.XmlReader) |
Overloaded:IsStartElement() See base class member description: System.Xml.XmlReader.IsStartElementCalls XmlReader.MoveToContent and tests if the current content node is a start tag or empty element tag. |
IsStartElement (inherited from System.Xml.XmlReader) |
Overloaded:IsStartElement(string name) See base class member description: System.Xml.XmlReader.IsStartElementCalls XmlReader.MoveToContent and tests if the current content node is a start tag or empty element tag and if the XmlReader.Name property of the element found matches the given argument. |
IsStartElement (inherited from System.Xml.XmlReader) |
Overloaded:IsStartElement(string localname, string ns) See base class member description: System.Xml.XmlReader.IsStartElementCalls XmlReader.MoveToContent and tests if the current content node is a start tag or empty element tag and if the XmlReader.LocalName and XmlReader.NamespaceURI properties of the element found match the given strings. |
LookupNamespace | Overridden: Resolves a namespace prefix in the current element's scope. |
MoveToAttribute | Overloaded:MoveToAttribute(int i) Overridden: Moves to the attribute with the specified index. |
MoveToAttribute | Overloaded:MoveToAttribute(string name) Overridden: Moves to the attribute with the specified name. |
MoveToAttribute | Overloaded:MoveToAttribute(string localName, string namespaceURI) Overridden: Moves to the attribute with the specified local name and namespace URI. |
MoveToContent (inherited from System.Xml.XmlReader) |
See base class member description: System.Xml.XmlReader.MoveToContent Checks whether the current node is a content (non-white space text, CDATA, Element, EndElement, EntityReference, or EndEntity) node. If the node is not a content node, the reader skips ahead to the next content node or end of file. It skips over nodes of the following type: ProcessingInstruction, DocumentType, Comment, Whitespace, or SignificantWhitespace. |
MoveToElement | Overridden: Moves to the element that contains the current attribute node. |
MoveToFirstAttribute | Overridden: Moves to the first attribute. |
MoveToNextAttribute | Overridden: Moves to the next attribute. |
Read | Overridden: Reads the next node from the stream. |
ReadAttributeValue | Overridden: Parses the attribute value into one or more Text, EntityReference, or EndEntity nodes. |
ReadBase64 | Decodes Base64 and returns the decoded binary bytes. |
ReadBinHex | Decodes BinHex and returns the decoded binary bytes. |
ReadChars | Reads the text contents of an element into a character buffer. This method is designed to read large streams of embedded text by calling it successively. |
ReadElementString (inherited from System.Xml.XmlReader) |
Overloaded:ReadElementString() See base class member description: System.Xml.XmlReader.ReadElementStringReads a text-only element. |
ReadElementString (inherited from System.Xml.XmlReader) |
Overloaded:ReadElementString(string name) See base class member description: System.Xml.XmlReader.ReadElementStringChecks that the XmlReader.Name property of the element found matches the given string before reading a text-only element. |
ReadElementString (inherited from System.Xml.XmlReader) |
Overloaded:ReadElementString(string localname, string ns) See base class member description: System.Xml.XmlReader.ReadElementStringChecks that the XmlReader.LocalName and XmlReader.NamespaceURI properties of the element found matches the given strings before reading a text-only element. |
ReadEndElement (inherited from System.Xml.XmlReader) |
See base class member description: System.Xml.XmlReader.ReadEndElement Checks that the current content node is an end tag and advances the reader to the next node. |
ReadInnerXml | Overridden: Reads all the content, including markup, as a string. |
ReadOuterXml | Overridden: Reads the content, including markup, representing this node and all its children. |
ReadStartElement (inherited from System.Xml.XmlReader) |
Overloaded:ReadStartElement() See base class member description: System.Xml.XmlReader.ReadStartElementChecks that the current node is an element and advances the reader to the next node. |
ReadStartElement (inherited from System.Xml.XmlReader) |
Overloaded:ReadStartElement(string name) See base class member description: System.Xml.XmlReader.ReadStartElementChecks that the current content node is an element with the given XmlReader.Name and advances the reader to the next node. |
ReadStartElement (inherited from System.Xml.XmlReader) |
Overloaded:ReadStartElement(string localname, string ns) See base class member description: System.Xml.XmlReader.ReadStartElementChecks that the current content node is an element with the given XmlReader.LocalName and XmlReader.NamespaceURI and advances the reader to the next node. |
ReadString | Overridden: Reads the contents of an element or a text node as a string. |
ResetState | Resets the state of the reader to ReadState.Initial. |
ResolveEntity | Overridden: Resolves the entity reference for EntityReference nodes. |
Skip (inherited from System.Xml.XmlReader) |
See base class member description: System.Xml.XmlReader.Skip Skips the children of the current node. |
ToString (inherited from System.Object) |
See base class member description: System.Object.ToString Derived from System.Object, the primary base class for all objects. |
ctor #1 | Overloaded:.ctor() Default constructor. This constructor is called by derived class constructors to initialize state in this type.Initializes a new instance of the XmlTextReader. |
ctor #5 | Overloaded:.ctor(XmlNameTable nt) Initializes a new instance of the XmlTextReader class with the specified XmlNameTable. |
Finalize (inherited from System.Object) |
See base class member description: System.Object.Finalize Derived from System.Object, the primary base class for all objects. |
MemberwiseClone (inherited from System.Object) |
See base class member description: System.Object.MemberwiseClone Derived from System.Object, the primary base class for all objects. |
Hierarchy:
protected XmlTextReader(); |
public XmlTextReader( |
input
public XmlTextReader( |
url
using System; using System.IO; using System.Xml; //Reads an XML document public class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { //Load the reader with the data file and ignore all white space nodes. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; //Parse the file and display each of the nodes. while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.CDATA: Console.Write("<![CDATA[{0}]]>", reader.Value); break; case XmlNodeType.ProcessingInstruction: Console.Write("<?{0} {1}?>", reader.Name, reader.Value); break; case XmlNodeType.Comment: Console.Write("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: Console.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); break; case XmlNodeType.EntityReference: Console.Write(reader.Name); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader!=null) reader.Close(); } } } // End class
The example uses the file, items.xml, as input.
<?xml version="1.0"?> <!-- This is a sample XML document --> <!DOCTYPE Items [<!ENTITY number "123">]> <Items> <Item>Test with an entity: &number;</Item> <Item>test with a child element <more/> stuff</Item> <Item>test with a CDATA section <![CDATA[<456>]]> def</Item> <Item>Test with an char entity: A</Item> <!-- Fourteen chars in this element.--> <Item>1234567890ABCD</Item> </Items>
public XmlTextReader( |
input
protected XmlTextReader( |
nt
public XmlTextReader( |
input
nt
Exception Type | Condition |
---|---|
NullReferenceException | The nt value is null. |
If you specify a name table, this constructor uses the names defined already in that table.
url
input
public XmlTextReader( |
url
input
public XmlTextReader( |
url
nt
Exception Type | Condition |
---|---|
NullReferenceException | The nt value is null. |
public XmlTextReader( |
input
nt
Exception Type | Condition |
---|---|
NullReferenceException | The nt value is null. |
public XmlTextReader( |
xmlFragment
fragType
context
xml:lang
, and the xml:space
scope. The XmlParserContext in which the xmlFragment is to be parsed. This includes the XmlNameTable to use, encoding, namespace scope, the current xml:lang
, and the xml:space
scope.Exception Type | Condition |
---|---|
XmlException | fragType is not Element, Attribute, or Document. |
The following table lists valid values for fragType.
XmlNodeType | Fragment May Contain |
---|---|
Element | Any valid element content (for example, any combination of elements, comments, processing instructions, CDATA sections, text, and entity references). |
Attribute | The value of an attribute (the part inside the quotes). |
Document | The contents of an entire XML document. This will enforce document level rules. |
The reader uses the following to determine the encoding of the stream.
public XmlTextReader( |
url
input
nt
Exception Type | Condition |
---|---|
NullReferenceException | The nt value is null. |
public XmlTextReader( |
url
input
nt
Exception Type | Condition |
---|---|
NullReferenceException | The nt value is null. |
public XmlTextReader( |
xmlFragment
fragType
context
xml:lang
, and the xml:space
scope. The XmlParserContext in which the xmlFragment is to be parsed. This includes the XmlNameTable to use, encoding, namespace scope, the current xml:lang
, and the xml:space
scope.Exception Type | Condition |
---|---|
XmlException | fragType is not Element, Attribute, or Document. |
The following table lists valid values for fragType and how the reader will parse each of the different node types.
XmlNodeType | Fragment May Contain |
---|---|
Element | Any valid element content (for example, any combination of elements, comments, processing instructions, CDATA sections, text, and entity references). |
Attribute | The value of an attribute (the part inside the quotes). |
Document | The contents of an entire XML document. This will enforce document level rules. |
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { //Create the XML fragment to be parsed. string xmlFrag ="<book> " + "<title>Pride And Prejudice</title>" + "<bk:genre>novel</bk:genre>" + "</book>"; //Create the XmlNamespaceManager. NameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); nsmgr.AddNamespace("bk", "urn:sample"); //Create the XmlParserContext. XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); //Create the reader. XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); //Parse the XML. If they exist, display the prefix and //namespace URI of each element. while (reader.Read()){ if (reader.IsStartElement()){ if (reader.Prefix==String.Empty) Console.WriteLine("<{0}>", reader.LocalName); else{ Console.Write("<{0}:{1}>", reader.Prefix, reader.LocalName); Console.WriteLine(" The namespace URI is " + reader.NamespaceURI); } } } //Close the reader. reader.Close(); } } // End class
public override int AttributeCount {get;}
|
public void DisplayAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); Console.Write(" {0}={1}", reader.Name, reader.Value); } reader.MoveToElement(); //Moves the reader back to the element node. } }
public override string BaseURI {get;}
|
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("http://localhost/baseuri.xml"); //Parse the file and display the base URI for each node. while (reader.Read()) { Console.WriteLine("({0}) {1}", reader.NodeType, reader.BaseURI); } } finally { if (reader!=null) reader.Close(); } } } // End classThe example uses the file, baseuri.xml, as input.
<!-- XML fragment --> <book genre="novel"> <title>Pride And Prejudice</title> </book>
public virtual bool CanResolveEntity {get;}
|
public override int Depth {get;}
|
using System; using System.IO; using System.Xml; public class Sample{ public static void Main(){ // Create the XML fragment to be parsed. string xmlFrag = @"<book> <misc> <style>paperback</style> <pages>240</pages> </misc> </book>"; // Create the XmlNamespaceManager. NameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); // Create the XmlParserContext. XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); // Create the reader. XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); // Parse the XML and display each node. while (reader.Read()){ switch (reader.NodeType){ case XmlNodeType.Element: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine(" {0}", reader.Value); break; case XmlNodeType.EndElement: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine("</{0}>", reader.Name); break; } } // Close the reader. reader.Close(); } }
public Encoding Encoding {get;}
|
public override bool EOF {get;}
|
public virtual bool HasAttributes {get;}
|
public void DisplayAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); while (reader.MoveToNextAttribute()) { Console.WriteLine(" {0}={1}", reader.Name, reader.Value); } } }
public override bool HasValue {get;}
|
Node Type | Value |
---|---|
Attribute | The value of the attribute. |
CDATA | The content of the CDATA section. |
Comment | The content of the comment. |
DocumentType | The internal subset. |
ProcessingInstruction | The entire content, excluding the target. |
SignificantWhitespace | The white space between markup in a mixed content model. |
Text | The content of the text node. |
Whitespace | The white space between markup. |
XmlDeclaration | The content of the declaration. |
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("book1.xml"); reader.WhitespaceHandling = WhitespaceHandling.None; //Parse the file and display each node. while (reader.Read()) { if (reader.HasValue) Console.WriteLine("({0}) {1}={2}", reader.NodeType, reader.Name, reader.Value); else Console.WriteLine("({0}) {1}", reader.NodeType, reader.Name); } } finally { if (reader!=null) reader.Close(); } } } // End classThe example uses the file, book1.xml, as input.
<?xml version='1.0' ?> <!DOCTYPE book [<!ENTITY h 'hardcover'>]> <book> <title>Pride And Prejudice</title> <misc>&h;</misc> </book>
public override bool IsDefault {get;}
|
<MyElement/>
).
public override bool IsEmptyElement {get;}
|
<item
bar="123"/>
(IsEmptyElement is true).
<item
bar="123">
(IsEmptyElement is false).
A corresponding EndElement node is not generated for empty elements.
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("elems.xml"); //Parse the XML and display the text content of each of the elements. while (reader.Read()){ if (reader.IsStartElement()){ if (reader.IsEmptyElement) Console.WriteLine("<{0}/>", reader.Name); else{ Console.Write("<{0}> ", reader.Name); reader.Read(); //Read the start tag. if (reader.IsStartElement()) //Handle nested elements. Console.Write("\r\n<{0}>", reader.Name); Console.WriteLine(reader.ReadString()); //Read the text content of the element. } } } } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, elems.xml, as input.
<book> <title>Pride And Prejudice</title> <price>19.95</price> <misc/> </book>
public override string this[int i] {get;}
|
i
Exception Type | Condition |
---|---|
ArgumentOutOfRangeException | The i parameter is less than 0 or greater than or equal to XmlTextReader.AttributeCount. |
public void DisplayAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); for (int i = 0; i < reader.AttributeCount; i++) { Console.WriteLine(" {0}", reader[i]); } } }
public override string this[string name] {get;}
|
name
If the reader is positioned on a DocumentType node, this method can be used to get the PUBLIC and SYSTEM literals, for example,
reader["PUBLIC"]
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("attrs.xml"); //Read the ISBN attribute. reader.MoveToContent(); string isbn =reader["ISBN"]; Console.WriteLine("The ISBN value: " + isbn); } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, attrs.xml, as input.
<book genre='novel' ISBN='1-861003-78' pubdate='1987'> </book>
public override string this[string name, string namespaceURI] {get;}
|
name
namespaceURI
public int LineNumber {get;}
|
Combined with XmlTextReader.LinePosition, a value of 1,1 indicates the start of the document.
using System; using System.IO; using System.Xml; public class Sample{ public static void Main(){ // Create the XML fragment to be parsed. string xmlFrag = @"<book> <misc> <style>paperback</style> <pages>240</pages> </misc> </book>"; // Create the XmlNamespaceManager. NameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); // Create the XmlParserContext. XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); // Create the reader. XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); // Parse the XML and display each node. while (reader.Read()){ switch (reader.NodeType){ case XmlNodeType.Element: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine(" {0}", reader.Value); break; case XmlNodeType.EndElement: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine("</{0}>", reader.Name); break; } } // Close the reader. reader.Close(); } }
public int LinePosition {get;}
|
The position indicated is the first character of text in the markup.
<root> abc<tag/> </root>
On the first line of the preceding XML text, a LinePosition of 2 corresponds to the character
r
; on the second line, a LinePosition of 5 corresponds to the character
t
; and on the third line, a LinePosition of 3 corresponds to the character
r
.
Combined with XmlTextReader.LineNumber, a value of 1,1 indicates the start of the document.
using System; using System.IO; using System.Xml; public class Sample{ public static void Main(){ // Create the XML fragment to be parsed. string xmlFrag = @"<book> <misc> <style>paperback</style> <pages>240</pages> </misc> </book>"; // Create the XmlNamespaceManager. NameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); // Create the XmlParserContext. XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); // Create the reader. XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); // Parse the XML and display each node. while (reader.Read()){ switch (reader.NodeType){ case XmlNodeType.Element: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine(" {0}", reader.Value); break; case XmlNodeType.EndElement: Console.Write("{0} {1},{2} ", reader.Depth, reader.LineNumber, reader.LinePosition); Console.WriteLine("</{0}>", reader.Name); break; } } // Close the reader. reader.Close(); } }
public override string LocalName {get;}
|
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("book2.xml"); //Parse the file. If they exist, display the prefix and //namespace URI of each node. while (reader.Read()){ if (reader.IsStartElement()){ if (reader.Prefix==String.Empty) Console.WriteLine("<{0}>", reader.LocalName); else{ Console.Write("<{0}:{1}>", reader.Prefix, reader.LocalName); Console.WriteLine(" The namespace URI is " + reader.NamespaceURI); } } } } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, book2.xml, as input.
<book xmlns:bk='urn:samples'> <title>Pride And Prejudice</title> <bk:genre>novel</bk:genre> </book>
public override string Name {get;}
|
using System; using System.IO; using System.Xml; //Reads an XML document public class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { //Load the reader with the data file and ignore all white space nodes. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; //Parse the file and display each of the nodes. while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.CDATA: Console.Write("<![CDATA[{0}]]>", reader.Value); break; case XmlNodeType.ProcessingInstruction: Console.Write("<?{0} {1}?>", reader.Name, reader.Value); break; case XmlNodeType.Comment: Console.Write("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: Console.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); break; case XmlNodeType.EntityReference: Console.Write(reader.Name); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader!=null) reader.Close(); } } } // End class
The sample uses the file items.xml.
<?xml version="1.0"?> <!-- This is a sample XML document --> <!DOCTYPE Items [<!ENTITY number "123">]> <Items> <Item>Test with an entity: &number;</Item> <Item>test with a child element <more/> stuff</Item> <Item>test with a CDATA section <![CDATA[<456>]]> def</Item> <Item>Test with an char entity: A</Item> <!-- Fourteen chars in this element.--> <Item>1234567890ABCD</Item> </Items>
public bool Namespaces {get; set;}
|
Exception Type | Condition |
---|---|
InvalidOperationException | Setting this property after a read operation has occurred ( XmlTextReader.ReadState is not ReadState.Initial). |
The Namespaces property cannot be set after a read operation has occurred.
public override string NamespaceURI {get;}
|
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("book2.xml"); //Parse the file. If they exist, display the prefix and //namespace URI of each node. while (reader.Read()){ if (reader.IsStartElement()){ if (reader.Prefix==String.Empty) Console.WriteLine("<{0}>", reader.LocalName); else{ Console.Write("<{0}:{1}>", reader.Prefix, reader.LocalName); Console.WriteLine(" The namespace URI is " + reader.NamespaceURI); } } } } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, book2.xml, as input.
<book xmlns:bk='urn:samples'> <title>Pride And Prejudice</title> <bk:genre>novel</bk:genre> </book>
public override XmlNameTable NameTable {get;}
|
public override XmlNodeType NodeType {get;}
|
using System; using System.IO; using System.Xml; //Reads an XML document public class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { //Load the reader with the data file and ignore all white space nodes. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; //Parse the file and display each of the nodes. while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.CDATA: Console.Write("<![CDATA[{0}]]>", reader.Value); break; case XmlNodeType.ProcessingInstruction: Console.Write("<?{0} {1}?>", reader.Name, reader.Value); break; case XmlNodeType.Comment: Console.Write("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: Console.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); break; case XmlNodeType.EntityReference: Console.Write(reader.Name); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader!=null) reader.Close(); } } } // End class
The sample uses the file items.xml.
<?xml version="1.0"?> <!-- This is a sample XML document --> <!DOCTYPE Items [<!ENTITY number "123">]> <Items> <Item>Test with an entity: &number;</Item> <Item>test with a child element <more/> stuff</Item> <Item>test with a CDATA section <![CDATA[<456>]]> def</Item> <Item>Test with an char entity: A</Item> <!-- Fourteen chars in this element.--> <Item>1234567890ABCD</Item> </Items>
public bool Normalization {get; set;}
|
If Normalization is set to false, this also disables character range checking for numeric entities. As a result, character entities, such as
�
, are allowed.
The following describes attribute value normalization:
Refer to the W3C XML 1.0 recommendation for further discussion on normalization.
using System; using System.IO; using System.Xml; public class Sample{ public static void Main(){ // Create the XML fragment to be parsed. string xmlFrag = @"<item attr1=' test A B C 1 2 3'/> <item attr2=''/>"; // Create the XmlNamespaceManager. XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable()); // Create the XmlParserContext. XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.Preserve); // Create the reader. XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); // Show attribute value normalization. reader.Read(); reader.Normalization = false; Console.WriteLine("Attribute value:{0}", reader.GetAttribute("attr1")); reader.Normalization = true; Console.WriteLine("Attribute value:{0}", reader.GetAttribute("attr1")); // Set Normalization back to false. This allows the reader to accept // character entities in the � to  range. If Normalization had // been set to true, character entities in this range throw an exception. reader.Normalization = false; reader.Read(); reader.MoveToContent(); Console.WriteLine("Attribute value:{0}", reader.GetAttribute("attr2")); // Close the reader. reader.Close(); } }
public override string Prefix {get;}
|
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("book2.xml"); //Parse the file. If they exist, display the prefix and //namespace URI of each node. while (reader.Read()){ if (reader.IsStartElement()){ if (reader.Prefix==String.Empty) Console.WriteLine("<{0}>", reader.LocalName); else{ Console.Write("<{0}:{1}>", reader.Prefix, reader.LocalName); Console.WriteLine(" The namespace URI is " + reader.NamespaceURI); } } } } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, book2.xml, as input.
<book xmlns:bk='urn:samples'> <title>Pride And Prejudice</title> <bk:genre>novel</bk:genre> </book>
public override char QuoteChar {get;}
|
public override ReadState ReadState {get;}
|
public override string Value {get;}
|
using System; using System.IO; using System.Xml; //Reads an XML document public class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { //Load the reader with the data file and ignore all white space nodes. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; //Parse the file and display each of the nodes. while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.CDATA: Console.Write("<![CDATA[{0}]]>", reader.Value); break; case XmlNodeType.ProcessingInstruction: Console.Write("<?{0} {1}?>", reader.Name, reader.Value); break; case XmlNodeType.Comment: Console.Write("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: Console.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); break; case XmlNodeType.EntityReference: Console.Write(reader.Name); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader!=null) reader.Close(); } } } // End class
The sample uses the file items.xml.
<?xml version="1.0"?> <!-- This is a sample XML document --> <!DOCTYPE Items [<!ENTITY number "123">]> <Items> <Item>Test with an entity: &number;</Item> <Item>test with a child element <more/> stuff</Item> <Item>test with a CDATA section <![CDATA[<456>]]> def</Item> <Item>Test with an char entity: A</Item> <!-- Fourteen chars in this element.--> <Item>1234567890ABCD</Item> </Items>
public WhitespaceHandling WhitespaceHandling {get; set;}
|
Exception Type | Condition |
---|---|
ArgumentOutOfRangeException | Invalid value specified. |
InvalidOperationException | Setting this property when the reader is closed ( XmlTextReader.ReadState is ReadState.Closed. |
Because the XmlTextReader does not have DTD information available to it, SignificantWhitepsace nodes are only returned within the an
xml:space='preserve'
scope.
using System; using System.IO; using System.Xml; public class Sample { public static void Main(){ //Create the XML fragment to be parsed. string xmlFrag ="<book> " + " <title>Pride And Prejudice</title>" + " <genre>novel</genre>" + "</book>"; //Create the XmlNamespaceManager. NameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); //Create the XmlParserContext. XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.Default); Console.WriteLine("Read the XML and ignore all white space..."); ReadXML(context, xmlFrag, WhitespaceHandling.None); Console.WriteLine("\r\nRead the XML including white space nodes..."); ReadXML(context, xmlFrag, WhitespaceHandling.All); } public static void ReadXML(XmlParserContext context, string xmlFrag, WhitespaceHandling ws){ //Create the reader and specify the WhitespaceHandling setting. XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); reader.WhitespaceHandling = ws; //Parse the XML and display each of the nodes. while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.WriteLine("{0}: <{1}>", reader.NodeType, reader.Name); break; case XmlNodeType.Text: Console.WriteLine("{0}: {1}", reader.NodeType, reader.Value); break; case XmlNodeType.EndElement: Console.WriteLine("{0}: </{1}>", reader.NodeType, reader.Name); break; case XmlNodeType.Whitespace: Console.WriteLine("{0}:", reader.NodeType); break; case XmlNodeType.SignificantWhitespace: Console.WriteLine("{0}:", reader.NodeType); break; } } //Close the reader. reader.Close(); } } // End class
public override string XmlLang {get;}
|
<root xml:lang="en-us">
<name>Fred</name>
</root>
When the reader is positioned on the name element, you can use this property to find that it is in the scope of a US English xml:lang attribute.
The string returned is also in XmlTextReader.NameTable.
using System; using System.IO; using System.Xml; public class Sample{ public static void Main(){ //Create the XML fragment to be parsed. string xmlFrag = "<book xml:lang='en-US'> " + " <title xml:lang='en-GB'>Colour Analysis</title>" + " <title>Color Analysis</title>" + "</book>"; //Create the XmlNamespaceManager. NameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); //Create the XmlParserContext. XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); //Create the reader. XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); reader.WhitespaceHandling = WhitespaceHandling.None; //Parse the XML and display each of the nodes, including the xml:lang setting. while (reader.Read()){ switch (reader.NodeType){ case XmlNodeType.Element: Console.WriteLine("{0}: <{1}>", reader.XmlLang, reader.Name); break; case XmlNodeType.Text: Console.WriteLine("{0}: {1}", reader.XmlLang, reader.Value); break; case XmlNodeType.EndElement: Console.WriteLine("{0}: </{1}>", reader.XmlLang, reader.Name); break; } } //Close the reader. reader.Close(); } }
XmlResolver XmlResolver {set;}
|
<!DOCTYPE book SYSTEM book.dtd>
the reader resolves this external file and ensures that the DTD is well-formed. The reader does not use the DTD for validation.If this property is not set, the reader uses the XmlUrlResolver with default credentials (Credentials.DefaultCredentials). However, if you have implemented a custom XmlResolver, you can specify the use of your custom XmlResolver instead.
This property can be changed at any time and takes effect on the next read operation. If this property is set to null, any external DTD or entities encountered by the reader are not resolved.
public override XmlSpace XmlSpace {get;}
|
xml:space='preserve'
scope is found.using System; using System.IO; using System.Xml; public class Sample{ public static void Main(){ XmlTextReader reader = new XmlTextReader("authors.xml"); reader.WhitespaceHandling = WhitespaceHandling.None; // Parse the file. Return white space only if an // xml:space='preserve' attribute is found. while (reader.Read()){ switch (reader.NodeType){ case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); if (reader.XmlSpace==XmlSpace.Preserve) reader.WhitespaceHandling=WhitespaceHandling.Significant; break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; case XmlNodeType.SignificantWhitespace: Console.Write(reader.Value); break; } } } }The example uses the file, authors.xml, as input.
<book xml:space='preserve'> <title>Color Analysis</title> <authors> <first>Michael</first> <last>Dunn</last> <first>Kim</first> <last>Akers</last> </authors> </book>
public override void Close(); |
If Close has already been called, no action is performed.
~XmlTextReader(); |
i
Exception Type | Condition |
---|---|
ArgumentOutOfRangeException | The i parameter is less than 0 or greater than or equal to XmlTextReader.AttributeCount. |
name
If the reader is positioned on a DocumentType node, this method can be used to get the PUBLIC and SYSTEM literals, for example,
reader.GetAttribute("PUBLIC")
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("attrs.xml"); //Read the ISBN attribute. reader.MoveToContent(); string isbn = reader.GetAttribute("ISBN"); Console.WriteLine("The ISBN value: " + isbn); } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, attrs.xml, as input.
<book genre='novel' ISBN='1-861003-78' pubdate='1987'> </book>
localName
namespaceURI
<test xmlns:dt="urn:datatypes" dt:type="int"/>
You can lookup the dt:type attribute using one argument (prefix and local name) or two arguments (local name and namespace URI):
String dt = reader.GetAttribute("dt:type");
String dt2 = reader.GetAttribute("type","urn:datatypes");
To lookup the xmlns:dt attribute, use one of the following arguments:
String dt3 = reader.GetAttribute("xmlns:dt");
String dt4 = reader.GetAttribute("dt",http://www.w3.org/2000/xmlns/);
You can also get this information using the XmlTextReader.Prefix property.
public virtual int GetHashCode(); |
public TextReader GetRemainder(); |
After calling this method, XmlTextReader.EOF is set to true.
using System; using System.IO; using System.Xml; public class Sample { private static string filename = "tworeads.xml"; public static void Main(string[] args) { XmlTextReader reader = new XmlTextReader(filename); reader.WhitespaceHandling=WhitespaceHandling.None; //Read the first part of the XML document while(reader.Read()) { //Display the elements and stop reading on the book endelement tag //then go to ReadPart2 to start another reader to read the rest of the file. switch(reader.NodeType) { case XmlNodeType.Element: Console.WriteLine("Name: {0}", reader.Name); break; case XmlNodeType.Text: Console.WriteLine(" Element Text: {0}", reader.Value); break; case XmlNodeType.EndElement: //Stop reading when the reader gets to the end element of the book node. if ("book"==reader.LocalName) { Console.WriteLine("End reading first book..."); Console.WriteLine(); goto ReadPart2; } break; } } //Read the rest of the XML document ReadPart2: Console.WriteLine("Begin reading second book..."); //Create a new reader to read the rest of the document. XmlTextReader reader2 = new XmlTextReader(reader.GetRemainder()); while(reader2.Read()) { switch (reader2.NodeType) { case XmlNodeType.Element: Console.WriteLine("Name: {0}", reader2.Name); break; case XmlNodeType.Text: Console.WriteLine(" Element Text: {0}", reader2.Value); break; case XmlNodeType.EndElement: //Stop reading when the reader gets to the end element of the book node. if ("book"==reader2.LocalName) { Console.WriteLine("End reading second book..."); goto Done; } break; } } Done: Console.WriteLine("Done."); reader.Close(); reader2.Close(); } }//End class
The example uses the input file tworeads.xml
<?xml version="1.0" ?> <bookstore> <book> <title>Pride And Prejudice</title> <author>Jane Austen</author> </book> <book> <title>The Handmaid's Tale</title> <author>Margaret Atwood</author> </book> </bookstore>
public Type GetType(); |
public virtual bool IsStartElement(); |
Exception Type | Condition |
---|---|
XmlException | Incorrect XML is encountered in the input stream. |
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("elems.xml"); //Parse the XML and display the text content of each of the elements. while (reader.Read()){ if (reader.IsStartElement()){ if (reader.IsEmptyElement) Console.WriteLine("<{0}/>", reader.Name); else{ Console.Write("<{0}> ", reader.Name); reader.Read(); //Read the start tag. if (reader.IsStartElement()) //Handle nested elements. Console.Write("\r\n<{0}>", reader.Name); Console.WriteLine(reader.ReadString()); //Read the text content of the element. } } } } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, elems.xml, as input.
<book> <title>Pride And Prejudice</title> <price>19.95</price> <misc/> </book>
name
Exception Type | Condition |
---|---|
XmlException | Incorrect XML is encountered in the input stream. |
localname
ns
Exception Type | Condition |
---|---|
XmlException | Incorrect XML is encountered in the input stream. |
prefix
Exception Type | Condition |
---|---|
ArgumentNullException | The XmlTextReader.Namespaces property is set to true and the prefix value is null. |
<root xmlns:a="urn:456"> <item> <ref href="a:b"/> </item> </root>In the preceding XML, if the reader is positioned on the href attribute, the prefix
a
is resolved by calling
reader.LookupNamesapce("a")
. The returned string is
urn:456
.
protected object MemberwiseClone(); |
public override void MoveToAttribute( |
i
Exception Type | Condition |
---|---|
ArgumentOutOfRangeException | The i parameter is less than 0 or greater than or equal to XmlReader.AttributeCount. |
public void DisplayAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); Console.Write(" {0}={1}", reader.Name, reader.Value); } reader.MoveToElement(); //Moves the reader back to the element node. } }
name
localName
namespaceURI
public virtual XmlNodeType MoveToContent(); |
Exception Type | Condition |
---|---|
XmlException | Incorrect XML encountered in the input stream. |
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "price") { _price = reader.ReadString(); }
This code can handle the following inputs without breaking:
<price>123.4</price>
and
<?xml version="1.0"><!DOCTYPE price SYSTEM
"abc"><price>123.4</price>
and
<?xml version="1.0"><!DOCTYPE price SYSTEM "abc"
[<!ENTTIY p
"123.4">]><price>&p;</price>
and
<!-- some test comment --><?processing
instruction?><price>123.4</price>
public override bool MoveToElement(); |
public void DisplayAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); Console.Write(" {0}={1}", reader.Name, reader.Value); } reader.MoveToElement(); //Moves the reader back to the element node. } }
public override bool MoveToFirstAttribute(); |
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("attrs.xml"); //Read the genre attribute. reader.MoveToContent(); reader.MoveToFirstAttribute(); string genre=reader.Value; Console.WriteLine("The genre value: " + genre); } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, attrs.xml, as input.
<book genre='novel' ISBN='1-861003-78' pubdate='1987'> </book>
public override bool MoveToNextAttribute(); |
public void DisplayAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); while (reader.MoveToNextAttribute()) { Console.WriteLine(" {0}={1}", reader.Name, reader.Value); } } }
public override bool Read(); |
Exception Type | Condition |
---|---|
XmlException | An error occurred while parsing the XML. |
using System; using System.IO; using System.Xml; //Reads an XML document public class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { //Load the reader with the data file and ignore all white space nodes. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; //Parse the file and display each of the nodes. while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.CDATA: Console.Write("<![CDATA[{0}]]>", reader.Value); break; case XmlNodeType.ProcessingInstruction: Console.Write("<?{0} {1}?>", reader.Name, reader.Value); break; case XmlNodeType.Comment: Console.Write("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: Console.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value); break; case XmlNodeType.EntityReference: Console.Write(reader.Name); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader!=null) reader.Close(); } } } // End class
The sample uses the file items.xml.
<?xml version="1.0"?> <!-- This is a sample XML document --> <!DOCTYPE Items [<!ENTITY number "123">]> <Items> <Item>Test with an entity: &number;</Item> <Item>test with a child element <more/> stuff</Item> <Item>test with a CDATA section <![CDATA[<456>]]> def</Item> <Item>Test with an char entity: A</Item> <!-- Fourteen chars in this element.--> <Item>1234567890ABCD</Item> </Items>
public override bool ReadAttributeValue(); |
false if the reader is not positioned on an attribute node when the initial call is made or if all the attribute values have been read.
An empty attribute, such as,
misc=""
, returns true with a single node with a value of String.Empty.
General entities are returned as a single empty( XmlTextReader.Value is String.Empty) EntityReference node.
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Create the XML fragment to be parsed. string xmlFrag ="<book genre='novel' misc='sale-item &h; 1987'></book>"; //Create the XmlParserContext. XmlParserContext context; string subset = "<!ENTITY h 'hardcover'>"; context = new XmlParserContext(null, null, "book", null, null, subset, "", "", XmlSpace.None); //Create the reader. reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context); //Read the misc attribute. The attribute is parsed //into multiple text and entity reference nodes. reader.MoveToContent(); reader.MoveToAttribute("misc"); while (reader.ReadAttributeValue()){ if (reader.NodeType==XmlNodeType.EntityReference) Console.WriteLine("{0} {1}", reader.NodeType, reader.Name); else Console.WriteLine("{0} {1}", reader.NodeType, reader.Value); } } finally { if (reader != null) reader.Close(); } } } // End class
array
offset
len
Exception Type | Condition |
---|---|
XmlException | The Base64 sequence is not valid. |
ArgumentNullException | The value of array is null. |
ArgumentOutOfRangeException | offset < 0, or len < 0, or len > array. Length - offset. |
using System; using System.IO; using System.Xml; public class Sample { private const string filename = "data.xml"; public static void Main() { XmlTextReader reader = null; try { reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; while (reader.Read()) { if ("Base64" == reader.Name) break; } Console.WriteLine("Reading base64... "); int base64len = 0; byte[] base64 = new byte[1000]; base64len = reader.ReadBase64(base64, 0, 50); for (int i=0; i < base64len; i++) Console.Write(base64[i]); while (0 != base64len) { base64len = reader.ReadBase64(base64, 0, 50); for (int i=0; i < base64len; i++) Console.Write(base64[i]); } reader.Read(); //reads end element Console.WriteLine("\r\nReading binhex...."); int binhexlen = 0; byte[] binhex = new byte[1000]; binhexlen = reader.ReadBinHex(binhex, 0, 50); for (int i=0; i < binhexlen; i++) Console.Write(binhex[i]); while (0 != binhexlen) { binhexlen = reader.ReadBinHex(binhex, 0, 50); for (int i=0; i < binhexlen; i++) Console.Write(binhex[i]); } } catch (Exception e) { Console.WriteLine ("Exception: {0}", e.ToString()); } finally { Console.WriteLine(); Console.WriteLine("Processing of the file {0} complete.", filename); if (reader != null) reader.Close(); } } }
The sample uses the file data.xml
<data> <!-- sample data for base64 and binhex --> <Base64>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS 4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFi Y2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlp eYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrL zM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w ==</Base64> <BinHex>000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E 1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 42434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 65666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687 88898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AA ABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCD CECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0 F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF</BinHex> </data>
array
offset
len
Exception Type | Condition |
---|---|
XmlException | The BinHex sequence is not valid. |
ArgumentNullException | The value of array is null. |
ArgumentOutOfRangeException | offset < 0, or len < 0, or len > array. Length - offset. |
using System; using System.IO; using System.Xml; public class Sample { private const string filename = "data.xml"; public static void Main() { XmlTextReader reader = null; try { reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; while (reader.Read()) { if ("Base64" == reader.Name) break; } Console.WriteLine("Reading base64... "); int base64len = 0; byte[] base64 = new byte[1000]; base64len = reader.ReadBase64(base64, 0, 50); for (int i=0; i < base64len; i++) Console.Write(base64[i]); while (0 != base64len) { base64len = reader.ReadBase64(base64, 0, 50); for (int i=0; i < base64len; i++) Console.Write(base64[i]); } reader.Read(); //reads end element Console.WriteLine("\r\nReading binhex...."); int binhexlen = 0; byte[] binhex = new byte[1000]; binhexlen = reader.ReadBinHex(binhex, 0, 50); for (int i=0; i < binhexlen; i++) Console.Write(binhex[i]); while (0 != binhexlen) { binhexlen = reader.ReadBinHex(binhex, 0, 50); for (int i=0; i < binhexlen; i++) Console.Write(binhex[i]); } } catch (Exception e) { Console.WriteLine ("Exception: {0}", e.ToString()); } finally { Console.WriteLine(); Console.WriteLine("Processing of the file {0} complete.", filename); if (reader != null) reader.Close(); } } }
The sample uses the file data.xml
<data> <!-- sample data for base64 and binhex --> <Base64>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS 4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFi Y2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlp eYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrL zM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w ==</Base64> <BinHex>000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E 1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041 42434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364 65666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687 88898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AA ABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCD CECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0 F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF</BinHex> </data>
buffer
index
count
Exception Type | Condition |
---|---|
ArgumentException | count is greater than the space specified in the buffer (buffersize-index). |
ArgumentNullException | The buffer value is null. |
ArgumentOutOfRangeException | index < 0 or count < 0. |
In the following XML, if the reader is positioned on the start tag, ReadChars returns test and positions the reader after the end tag.
<Item>test</Item>
ReadChars has the following functionality:
<A>1<A>2</A>
, ReadChars returns
1<A>2</A>
. (It returns markup from the matching elment pair and ignores others.) For example, using the following XML:
<thing> some text </thing> <bar> </bar>
The reader is positioned on the
<bar>
element at the end of the while loop.
if (XmlNodeType.Element == reader.NodeType && "thing" == reader.Name) { while( 0 != reader.ReadChars(buffer, 0, 1) { // Do something. // Attribute values are not available at this point. } }
using System; using System.IO; using System.Xml; //Reads an XML document using ReadChars public class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { //Declare variables used by ReadChars Char []buffer; int iCnt = 0; int charbuffersize; //Load the reader with the data file. Ignore all whitespace. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; //Set variables used by ReadChars charbuffersize = 10; buffer = new Char[charbuffersize]; //Parse the file. Read the element content //using the ReadChars method. reader.MoveToContent(); while ( (iCnt = reader.ReadChars(buffer,0,charbuffersize)) > 0 ) { //Print out chars read and the buffer contents Console.WriteLine (" Chars read to buffer:" + iCnt); Console.WriteLine (" Buffer: [{0}]", new String(buffer,0,iCnt)); //Clear the buffer Array.Clear(buffer,0,charbuffersize); } } finally { if (reader!=null) reader.Close(); } } } //End class
public virtual string ReadElementString(); |
<item></item>
or
<item/>
).Exception Type | Condition |
---|---|
XmlException | The next content node is not a start tag; or the element found does not contain a simple text value. |
Using the XML,
<name>Arlene Huff</name>
, ReadElementString consumes the element and returns the string Arlene Huff.
This method cannot handle any markup (child elements, comments, processing instructions, and so on) inside the name element, but it can concatenate multiple adjacent text and CDATA blocks.
using System; using System.IO; using System.Xml; //Reads an XML fragment public class Sample { private const String filename = "book.xml"; public static void Main() { XmlTextReader reader = null; try { //Load the file and ignore all whitespace. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; //Moves the reader to the root element. reader.MoveToContent(); //Read the title and price elements. Console.WriteLine("Content of the title element: {0}", reader.ReadElementString()); Console.WriteLine("Content of the price element: {0}", reader.ReadElementString());; } finally { if (reader!=null) reader.Close(); } } } // End classThe example uses the data file book.xml:
<!--sample XML fragment--> <book genre='novel' ISBN='1-861003-78' misc='sale-item'> <title>The Handmaid's Tale</title> <price>14.95</price> </book>
name
<item></item>
or
<item/>
).Exception Type | Condition |
---|---|
XmlException | If the next content node is not a start tag; if the element Name does not match the given argument; or if the element found does not contain a simple text value. |
Using the XML,
<name>Arlene
Huff</name>
, ReadElementString consumes the element and returns the string Arlene Huff.
This method cannot handle any markup (child elements, comments, processing instructions, and so on) inside the name element, but it can concatenate multiple adjacent text and CDATA blocks.
localname
ns
<item></item>
or
<item/>
).Exception Type | Condition |
---|---|
XmlException | If the next content node is not a start tag; if the element LocalName or NamespaceURI do not match the given arguments; or if the element found does not contain a simple text value. |
Using the XML,
<name>Arlene
Huff</name>
, ReadElementString consumes the element and returns the string Arlene Huff.
This method cannot handle any markup (child elements, comments, processing instructions, and so on) inside the name element, but it can concatenate multiple adjacent text and CDATA blocks.
public virtual void ReadEndElement(); |
Exception Type | Condition |
---|---|
XmlException | The current node is not an end tag or if incorrect XML is encountered in the input stream. |
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { //Create the reader. XmlTextReader reader = new XmlTextReader("book3.xml"); //Parse the XML document. ReadString is used to //read the text content of the elements. reader.Read(); reader.ReadStartElement("book"); reader.ReadStartElement("title"); Console.Write("The content of the title element: "); Console.WriteLine(reader.ReadString()); reader.ReadEndElement(); reader.ReadStartElement("price"); Console.Write("The content of the price element: "); Console.WriteLine(reader.ReadString()); reader.ReadEndElement(); reader.ReadEndElement(); //Close the reader. reader.Close(); } } // End classThe example uses the file, book3.xml, as input.
<book> <title>Pride And Prejudice</title> <price>19.95</price> </book>
public override string ReadInnerXml(); |
If the current node is neither an element nor attribute, an empty string is returned.
Exception Type | Condition |
---|---|
XmlException | The XML was not well-formed, or an error occurred while parsing the XML. |
<node> this <child id="123"/> </node>
ReadInnerXml returns
this <child id="123"/>
This method handles element and attribute nodes in the following way:
Node Type | Child Content | Return Value | Position After the Call |
---|---|---|---|
Element | <item>text</item> | text | After the end tag. |
Attribute | <item attr1="val1" attr2="val2">text</item> | val1 | Remains on the attribute node attr1 . |
If the reader is positioned on a leaf node, calling ReadInnerXml is equivalent to calling XmlTextReader.Read.
This method also checks for well-formed XML.
using System; using System.IO; using System.Xml; //Reads an XML fragment public class Sample { private const String filename = "2books.xml"; public static void Main() { XmlTextReader reader = null; try { // Load the file and ignore all white space. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; // Moves the reader to the root element. reader.MoveToContent(); // Moves to book node. reader.Read(); // Note that ReadInnerXml only returns the markup of the node's children // so the book's attributes are not returned. Console.WriteLine("Read the first book using ReadInnerXml..."); Console.WriteLine(reader.ReadInnerXml()); // ReadOuterXml returns the markup for the current node and its children // so the book's attributes are also returned. Console.WriteLine("Read the second book using ReadOuterXml..."); Console.WriteLine(reader.ReadOuterXml()); } finally { if (reader!=null) reader.Close(); } } } // End classThe example uses the input file 2books.xml:
[VB, C#] <!--sample XML fragment--> <bookstore> <book genre='novel' ISBN='10-861003-324'> <title>The Handmaid's Tale</title> <price>19.95</price> </book> <book genre='novel' ISBN='1-861001-57-5'> <title>Pride And Prejudice</title> <price>24.95</price> </book> </bookstore>
public override string ReadOuterXml(); |
Exception Type | Condition |
---|---|
XmlException | The XML was not well-formed, or an error occurred while parsing the XML. |
This method handles element and attribute nodes in the following manner:
Node Type | Child Content | Return Value | Position After the Call |
---|---|---|---|
Element | <item>text</item> | <item>text</item> | After the end tag. |
Attribute | <item attr1="val1" attr2="val2">text</item> | attr="val1" | Remains on the attribute node attr1 . |
If the reader is positioned on a leaf node, calling ReadOuterXml is equivalent to calling XmlTextReader.Read.
This method also checks for well-formed XML.
using System; using System.IO; using System.Xml; //Reads an XML fragment public class Sample { private const String filename = "2books.xml"; public static void Main() { XmlTextReader reader = null; try { // Load the file and ignore all white space. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; // Moves the reader to the root element. reader.MoveToContent(); // Moves to book node. reader.Read(); // Note that ReadInnerXml only returns the markup of the node's children // so the book's attributes are not returned. Console.WriteLine("Read the first book using ReadInnerXml..."); Console.WriteLine(reader.ReadInnerXml()); // ReadOuterXml returns the markup for the current node and its children // so the book's attributes are also returned. Console.WriteLine("Read the second book using ReadOuterXml..."); Console.WriteLine(reader.ReadOuterXml()); } finally { if (reader!=null) reader.Close(); } } } // End classThe example uses the input file 2books.xml:
[VB, C#] <!--sample XML fragment--> <bookstore> <book genre='novel' ISBN='10-861003-324'> <title>The Handmaid's Tale</title> <price>19.95</price> </book> <book genre='novel' ISBN='1-861001-57-5'> <title>Pride And Prejudice</title> <price>24.95</price> </book> </bookstore>
public virtual void ReadStartElement(); |
Exception Type | Condition |
---|---|
XmlException | XmlReader.IsStartElement returns false. |
public virtual void ReadStartElement( |
name
Exception Type | Condition |
---|---|
XmlException | XmlReader.IsStartElement returns false or if the XmlReader.Name of the element does not match the given name. |
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { //Create the reader. XmlTextReader reader = new XmlTextReader("book3.xml"); //Parse the XML document. ReadString is used to //read the text content of the elements. reader.Read(); reader.ReadStartElement("book"); reader.ReadStartElement("title"); Console.Write("The content of the title element: "); Console.WriteLine(reader.ReadString()); reader.ReadEndElement(); reader.ReadStartElement("price"); Console.Write("The content of the price element: "); Console.WriteLine(reader.ReadString()); reader.ReadEndElement(); reader.ReadEndElement(); //Close the reader. reader.Close(); } } // End classThe example uses the file, book3.xml, as input.
<book> <title>Pride And Prejudice</title> <price>19.95</price> </book>
localname
ns
Exception Type | Condition |
---|---|
XmlException | XmlReader.IsStartElement returns false, or the XmlReader.LocalName and XmlReader.NamespaceURI properties of the element found do not match the given arguments. |
public override string ReadString(); |
Note: The text node can be either an element or an attribute text node.
Exception Type | Condition |
---|---|
XmlException | An error occurred while parsing the XML. |
If positioned on a text node, ReadString performs the same concatenation from the text node to the element end tag. If the reader is positioned on an attribute text node, ReadString has the same functionality as if the reader were position on the element start tag. It returns all the concatenated element text nodes.
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the reader with the XML file. reader = new XmlTextReader("elems.xml"); //Parse the XML and display the text content of each of the elements. while (reader.Read()){ if (reader.IsStartElement()){ if (reader.IsEmptyElement) Console.WriteLine("<{0}/>", reader.Name); else{ Console.Write("<{0}> ", reader.Name); reader.Read(); //Read the start tag. if (reader.IsStartElement()) //Handle nested elements. Console.Write("\r\n<{0}>", reader.Name); Console.WriteLine(reader.ReadString()); //Read the text content of the element. } } } } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, elems.xml, as input.
<book> <title>Pride And Prejudice</title> <price>19.95</price> <misc/> </book>
public void ResetState(); |
Exception Type | Condition |
---|---|
InvalidOperationException | Calling ResetState if the reader was constructed using an XmlParserContext. |
The following properties are not affected by ResetState.
using System; using System.IO; using System.Text; using System.Xml; public class Sample { public static void Main(){ Encoding enc = new UTF8Encoding(); byte[] utf8Buffer = enc.GetBytes("<root> 12345 </root>"); enc = new UnicodeEncoding(); byte[] unicodeBuffer = enc.GetBytes("<?xml version='1.0' ?><unicode> root </unicode>"); MemoryStream memStrm = new MemoryStream(); memStrm.Write(unicodeBuffer, 0, unicodeBuffer.Length); memStrm.Write(utf8Buffer, 0, utf8Buffer.Length); memStrm.Position = 0; XmlTextReader reader = new XmlTextReader(memStrm); while(reader.Read()) { Console.WriteLine("NodeType: {0}", reader.NodeType); if (XmlNodeType.EndElement == reader.NodeType && "root" == reader.Name) { break; } if (XmlNodeType.EndElement == reader.NodeType) { reader.ResetState(); } } } }
public override void ResolveEntity(); |
Exception Type | Condition |
---|---|
InvalidOperationException | Calling this method. |
public virtual void Skip(); |
<a>
node or any of its attributes, calling Skip positions the reader to the
<b>
node. If the reader is positioned on a leaf node already (such as the
<x>
node or the text node
abc
), calling Skip is the same as calling XmlReader.Read.
<a name="bob" age="123"> <x/>abc<y/> </a> <b> ... </b>
This method checks for well-formed XML.
If the reader is an XmlValidatingReader, this method also validates the skipped content.
using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextReader reader = null; try { //Load the XmlTextReader reader = new XmlTextReader("2books.xml"); reader.WhitespaceHandling = WhitespaceHandling.None; //Move the reader to the second book node. reader.MoveToContent(); reader.Read(); reader.Skip(); //Skip the first book. //Parse the file starting with the second book node. while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}", reader.Name); while (reader.MoveToNextAttribute()){ Console.Write(" {0}='{1}'", reader.Name, reader.Value); } Console.Write(">"); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader != null) reader.Close(); } } } // End classThe example uses the file, 2books.xml, as input.
<!--sample XML fragment--> <bookstore> <book genre='novel' ISBN='10-861003-324'> <title>The Handmaid's Tale</title> <price>19.95</price> </book> <book genre='novel' ISBN='1-861001-57-5'> <title>Pride And Prejudice</title> <price>24.95</price> </book> </bookstore>
public virtual string ToString(); |