C# XmlReader
last modified July 5, 2023
C# XmlReader tutorial shows how to use read XML data in C# with XmlReader.
XmlReader
XmlReader represents a reader that provides fast, noncached,
forward-only access to XML data.
The XmlReader is available in the System.Xml namespace.
C# XmlReader example
The following example creates a simple C# XmlReader.
<?xml version="1.0" encoding="utf-8"?> <value>6</value>
We have a very simple XML file.
using System.Xml;
using var reader = XmlReader.Create("data.xml");
reader.MoveToContent();
var data = reader.ReadElementContentAsString();
Console.WriteLine(data);
In the example, we read the value from the simple XML document with
XmlReader.
using var reader = XmlReader.Create("data.xml");
The XmlReader is created with the Create method.
reader.MoveToContent();
The MoveToContent method skips the non-content nodes and moves to
the next content node or to the end of the file.
var data = reader.ReadElementContentAsString();
The ReadElementContentAsString reads the current element and
returns the contents as a string.
$ dotnet run 6
C# XmlReader ReadToFollowing
The ReadToFollowing method advances the reader to the next
following element that matches the specified name and returns true if a matching
element is found.
<bookstore>
<book genre='Science Fiction'>
<title>Dune</title>
<author>Frank Herbert</author>
<price>8.99</price>
</book>
<book genre='Novel'>
<title>Old Goriot</title>
<author>Honoré de Balzac</author>
<price>9.0</price>
</book>
</bookstore>
This XML file contains books.
using System.Xml;
using var reader = XmlReader.Create("books.xml");
reader.ReadToFollowing("book");
do
{
reader.MoveToFirstAttribute();
Console.WriteLine($"genre: {reader.Value}");
reader.ReadToFollowing("title");
Console.WriteLine($"title: {reader.ReadElementContentAsString()}");
reader.ReadToFollowing("author");
Console.WriteLine($"author: {reader.ReadElementContentAsString()}");
reader.ReadToFollowing("price");
Console.WriteLine($"price: {reader.ReadElementContentAsString()}");
Console.WriteLine("-------------------------");
} while (reader.ReadToFollowing("book"));
The example reads two books from the books.xml file.
reader.ReadToFollowing("book");
We start by advancing to the first book element.
reader.MoveToFirstAttribute();
Console.WriteLine($"genre: {reader.Value}");
We read the genre attribute with MoveToFirstAttribute.
reader.ReadToFollowing("title");
Console.WriteLine($"title: {reader.ReadElementContentAsString()}");
We read the contents of the title element.
} while (reader.ReadToFollowing("book"));
With the while loop we go through all the book elements in the
XML file.
$ dotnet run genre: Science Fiction title: Dune author: Frank Herbert price: 8.99 ------------------------- genre: Novel title: Old Goriot author: Honoré de Balzac price: 9.0 -------------------------
C# XmlReader Read
The Read method reads the next node from the stream.
<?xml version="1.0" encoding="utf-8"?>
<products>
<product>
<id>1</id>
<name>Product A</name>
<price>1200</price>
</product>
<product>
<id>2</id>
<name>Product B</name>
<price>1100</price>
</product>
</products>
In this XML file, we have products.
using System.Xml;
Console.WriteLine("Products");
Console.WriteLine("----------------------");
using var reader = XmlReader.Create("products.xml");
reader.MoveToContent();
while (reader.Read())
{
string result = reader.NodeType switch
{
XmlNodeType.Element when reader.Name == "product" => $"{reader.Name}\n",
XmlNodeType.Element => $"{reader.Name}: ",
XmlNodeType.Text => $"{reader.Value}\n",
XmlNodeType.EndElement when reader.Name == "product" => "-------------------\n",
_ => ""
};
Console.Write(result);
}
The example presents the classic approach to reading XML files. We read the document node by node and in the switch statement or expression deal with the particular element, text, attribute or other type of node.
reader.MoveToContent();
We skip the root element and go right to the content of the document.
while (reader.Read())
{
The Read method reads the next node until the end of the document.
string result = reader.NodeType switch
{
XmlNodeType.Element when reader.Name == "product" => $"{reader.Name}\n",
XmlNodeType.Element => $"{reader.Name}: ",
XmlNodeType.Text => $"{reader.Value}\n",
XmlNodeType.EndElement when reader.Name == "product" => "-------------------\n",
_ => ""
};
We use the switch expression to process the different node types. The Name
property gives name of the current node. The Value property gets
the text value of the current node.
$ dotnet run Products ---------------------- product id: 1 name: Product A price: 1200 ---------------------- product id: 2 name: Product B price: 1100 ----------------------
Source
XmlReader class - language reference
In this article we have read XML data with XmlReader.
Author
List all C# tutorials.