|
https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx |
Опубликован: 14.11.2006 | Уровень: для всех | Доступ: платный
Лекция 10:
Работа с XML
Класс 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));
}