XmlReader provides us with a minimal resource-consuming way to parse XML data by reading the document forward and identifying the read elements. Most of the time we use XmlReader to validate the data validation of an XML file (using the Read () method of the XmlReader instance to read all the nodes sequentially to determine whether it matches the specified pattern). With this kind of non caching, read-only, forward-only way, a small amount of data is put into memory each time, and the memory footprint is small, which is the best choice for reading large XML files.
Let's take a look at the steps of the XmlReader class reading an XML file:
1, create an instance of the class using the Create () factory method of the XmlReader class, and pass the read XML filename as a parameter to the method;
2. Create a loop that calls the read () method repeatedly. This method starts at the first node of the file and reads all remaining nodes, but only one node is read per call. Returns true if one node can be read, and returns False when the end of the file is reached;
3. In this loop, the properties and methods of the XmlReader instance are checked to obtain information about the current node (type, name, data, and so on). Keep looping until read () returns false;
Let's look at an example:
Employees.xml file:
<?xml version= ' 1.0 '?>
<employees>
<employee id= "1" >
<name>
<firstname >Nancy</firstName>
<lastName>Davolio</lastName>
</name>
<city> seattle</city>
<state>WA</state>
<zipCode>98122</zipCode>
</ employee>
<employee id= "2" >
<name>
<firstName>Andrew</firstName>
<lastName>Fuller</lastName>
</name>
<city>Tacoma</city>
<state>WA</state>
<zipCode>98401</zipCode>
</employee>
</ Employees>
ASPX code:
<%@ Page language= "C #"%> <%@ Import namespace= ' system.xml '%> <script ' runat= ' server ' > void Page_Load (
Object sender, EventArgs e) {//location of XML file string xmlfilepath = Server.MapPath ("~/employees.xml");
try {using (XmlReader reader = Xmlreader.create (Xmlfilepath)) {string result; while (reader. Read ()) {//process Only the elements if reader.
NodeType = = xmlnodetype.element) {result = ""; for (int count = 1; Count <= reader. Depth;
count++) {result = = "= ="; result = = "=>" + reader.
Name + "<br/>";
Lblresult.text + = result; catch (Exception ex) {lblresult.text = "An Exception occurred:" + ex.
message; } </script>
Output results:
=> Employees
====> Employee
=======> Name
==========> FirstName
==========> LastName
=======> City
=======> State
=======> ZipCode
====> Employee
=======> Name
==========> FirstName
==========> LastName
=======> City
=======> State
=======> ZipCode
Let's look at the properties and methods of the XmlReader class:
Property |
Description |
Attributecount |
Returns the number of properties for the current node |
Depth |
Returns the depth of the current node to determine whether the specified node has child nodes |
Eof |
To determine whether the reader is at the end of the stream |
Hasattribute |
Returns a Boolean value indicating whether the current node has an attribute |
HasValue |
Returns a Boolean value indicating whether the current node has a value |
Isemptyelement |
Determines whether the current node is an empty element |
LocalName |
Returns the local name of the current node |
Name |
Returns the qualified name of the current node |
NamespaceURI |
Returns the namespace URI of the current node |
NodeType |
Returns the node type of the current node as a XmlNodeType enumeration |
Prefix |
Returns the namespace prefix associated with the current node |
ReadState |
Returns the current state of the reader in the form of a ReadState enumeration |
Settings |
Returns the XmlReaderSettings object used to create the XmlReader instance |
Value |
Returns the value of the current node |
ValueType |
Get the CLR type of the current node |
Important ways to XmlReader classes:
Method |
Description |
Close |
Close the XmlReader object by setting the ReadState enumeration to Closed |
Create |
Creates an instance of the XmlReader object and returns it to the calling program |
GetAttribute |
Get the value of a property |
Isstartelement |
Indicates whether the current node is a start tag |
MoveToAttribute |
Move the reader to the specified property |
MoveToContent |
If the current node is not a content node, move the reader to the next content node |
Movetoelement |
Moves the reader to the element that contains the current property; To enumerate properties and to switch to elements that contain all of these properties |
MoveToFirstAttribute |
Move the reader to the first property of the current node |
MoveToNextAttribute |
Move the reader to the next property of the current node |
Read |
Reading the next node from the stream |
ReadContentAs |
Reading the contents of an object that provides a type |
ReadElementContentAs |
Reads the current element and returns the contents of the specified type object |
Readendelement |
Move reader over current end tag and move to next node |
ReadInnerXml |
Reads all contents of the current node, including markup, as a string |
Readoutxml |
Read the contents of a node, including the current node tag and child nodes |
Readtodescendant |
Move the reader to the next node that matches the descendant element |
Readtofollowing |
Keep reading until you find the specified element |
Readtonextslibing |
Move the reader to the next node that matches the sibling element |
Readvaluechunk |
Allows reading of large text streams embedded in XML documents |
XmlNodeType members of the enumeration:
Members |
Description |
Attribute |
Property |
Cdata |
CDATA Region |
Comment |
XML annotations |
Document |
Document object that represents the root of the XML tree |
DocumentFragment |
Document fragment |
DocumentType |
Document Type declaration |
Element,endelement |
Start element and end element |
Entity,endentity |
Start entity declaration and end Entity declaration |
EntityReference |
Entity references (such as <) |
None |
There is no read node and query node type use |
notation |
Symbol entries in the DTD |
ProcessingInstruction |
XML processing Instructions |
SignificantWhitespace |
White space in a mixed content model document, or when Xml:space=preserve is set up using the |
Text |
The textual content of the element |
Whitespace |
whitespace between tags |
XmlDeclaration |
XML declaration at the top of the document |
Important attributes of the XmlReaderSettings class:
Property |
Description |
Checkcharacters |
Allows you to get or set a value that indicates whether the character check is performed |
ConformanceLevel |
To obtain or set the XmlReader object's compliance requirements |
Ignorecomment |
Allows you to get or set a value that indicates whether the annotation is ignored |
IgnoreprocessinginstructIon |
Specifies whether to ignore processing instructions |
Ignorewhitespace |
Specify whether to ignore meaningless spaces |
ProhibitDTD |
Specifies whether DTD processing is allowed |
Schemas |
Specifies the XmlSchemaSet to use when performing XML validation |
Validationflags |
Gets or sets the value used to specify the mode validation settings |
ValidationType |
Gets or sets a value that specifies the type of validation to be performed |
XmlResolver |
Set up a xmlreslover for accessing external documents |
With the XmlReaderSettings class, you can specify a series of features supported by the XmlReader object, so simply pass xmlreadersettings as a parameter into the XmlReader create () method. As shown below:
<script runat= "server" > void Page_Load (object sender, EventArgs e) {string x
Mlfilepath = Server.MapPath ("~/employees.xml"); Create the XmlReaderSettings object and set appropriate properties xmlreadersettings settings = new XmlReaderSettings ()
; Settings.
Ignorecomments = true; Settings.
Ignorewhitespace = true; try {//get reference to the XmlReader object using (XmlReader reader = xmlreader.create (Xmlfilepath, Settings)) {St
Ring result; while (reader. Read ()) {//process Only the elements if reader.
NodeType = = xmlnodetype.element) {//reset The variable for a new Element result = ""; for (int count = 1; Count <= reader. Depth;
count++) {result = = "= ="; result = = "=>" + reader.
Name + "<br/>";
Lblresult.text + = result; catch (Exception ex) {lblresult.text = "An Exception occurred:" + ex.
message; } </script>
In summary, we can use the XmlReader class to read XML files in a non cached, read-only, forward-only way, which takes up less memory and is recommended for everyone to use.