Класс XmlReader
С помощью класса XmlReader можно быстрее, чем другими методами, получить данные из XML-документов.
XmlReader — это абстрактный класс. Чтобы начать чтение, в статический метод Create передается объект класса XmlReaderSettings. Эта функция подсчитывает число узлов в документе:
using System.Xml; using System.IO;
private int CountNodes(string xmlFile) { int NodesCount=0; XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; settings.IgnoreComments = true;
using (XmlReader reader = XmlReader.Create(xmlFile, set- tings)) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { NodesCount++; } } } return NodesCount; }
Класс XmlReader позволяет извлекать из документа классы CLR. Пусть у нас есть меню ресторана:
<?xml version="1.0"?> <pizza_menu> <food name="Пицца Грандиозо"> <price>450.00</price> <description>Грибы, бекон, салями, ветчина, баварские сосиски, артишоки, высушенные на солнце помидоры, сыр Пармезан </description> <calories>700</calories> </food> <food name="Прэго пицца"> <price>306.00</price> <description> Кусочки нежной куриной грудки в соусе Песто, красный сладкий перец, грибы, кукуруза, сыр Пармезан </description> <calories>650</calories> </food> <food name="Пицца Маргарита"> <price>126.00</price> <description> Классическая итальянская пицца подается на выбор с базиликом или без базилика </description> <calories>600</calories> </food> </pizza_menu>
Напишем функцию, которая посчитает сумму цен и количества калорий в меню:
protected void Page_Load(object sender, EventArgs e) { int ItemsCount = 0; decimal DishesTotal = 0; UInt16 CaloriesTotal = 0; XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreWhitespace = true; NameTable nt = new NameTable(); object food = nt.Add("food"); object price = nt.Add("price"); object calories = nt.Add("calories"); settings.NameTable = nt; string MenuFile = Path.Combine(Request.PhysicalApplicationPath, "menu.xml"); using (XmlReader reader = XmlReader.Create(MenuFile, set- tings)) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && food.Equals(reader.LocalName)) { ItemsCount++; } if (reader.NodeType == XmlNodeType.Element && price.Equals(reader.LocalName)) { DishesTotal += (UInt16)reader.ReadElementContentAsDecimal(); } if (reader.NodeType == XmlNodeType.Element && calories.Equals(reader.LocalName)) { CaloriesTotal += (UInt16)reader.ReadElementContentAsInt(); } } } Response.Write(String.Format("Вы заказали {0} блюда на сумму {1:C}, {2} калорий", ItemsCount, DishesTotal, CaloriesTotal)); }