ZetCode

C# XmlReader

最后修改于 2023 年 7 月 5 日

C# XmlReader 教程展示了如何使用 XmlReader 在 C# 中读取 XML 数据。

XmlReader

XmlReader 表示提供对 XML 数据的快速、非缓存、只进访问的读取器。

XmlReaderSystem.Xml 命名空间中可用。

C# XmlReader 示例

以下示例创建了一个简单的 C# XmlReader。

data.xml
<?xml version="1.0" encoding="utf-8"?>
<value>6</value>

我们有一个非常简单的 XML 文件。

Program.cs
using System.Xml;

using var reader = XmlReader.Create("data.xml");

reader.MoveToContent();
var data = reader.ReadElementContentAsString();

Console.WriteLine(data);

在此示例中,我们使用 XmlReader 从简单的 XML 文档中读取值。

using var reader = XmlReader.Create("data.xml");

XmlReader 是使用 Create 方法创建的。

reader.MoveToContent();

MoveToContent 方法跳过非内容节点,并移动到下一个内容节点或文件末尾。

var data = reader.ReadElementContentAsString();

ReadElementContentAsString 读取当前元素并将内容作为字符串返回。

$ dotnet run 
6

C# XmlReader ReadToFollowing

ReadToFollowing 方法将读取器前进到下一个与指定名称匹配的元素,如果找到匹配的元素,则返回 true。

books.xml
<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>

此 XML 文件包含书籍。

Program.cs
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"));

该示例从 books.xml 文件中读取两本书。

reader.ReadToFollowing("book");

我们首先前进到第一个 book 元素。

reader.MoveToFirstAttribute();
Console.WriteLine($"genre: {reader.Value}");

我们使用 MoveToFirstAttribute 读取 genre 属性。

reader.ReadToFollowing("title");
Console.WriteLine($"title: {reader.ReadElementContentAsString()}");

我们读取 title 元素的内容。

} while (reader.ReadToFollowing("book"));

通过 while 循环,我们遍历 XML 文件中的所有 book 元素。

$ 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

Read 方法从流中读取下一个节点。

products.xml
<?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>

在此 XML 文件中,我们有产品。

Program.cs
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);
    
}

该示例展示了读取 XML 文件的经典方法。 我们逐个节点地读取文档,并在 switch 语句或表达式中处理特定的元素、文本、属性或其他类型的节点。

reader.MoveToContent();

我们跳过根元素,直接进入文档的内容。

while (reader.Read())
{

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",
    _ => ""
};

我们使用 switch 表达式来处理不同的节点类型。 Name 属性给出当前节点的名称。 Value 属性获取当前节点的文本值。

$ dotnet run
Products
----------------------
product
id: 1
name: Product A
price: 1200
----------------------
product
id: 2
name: Product B
price: 1100
----------------------

来源

XmlReader 类 - 语言参考

在本文中,我们使用 XmlReader 读取了 XML 数据。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程