Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 10:

Работа с XML

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >

Класс 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));
    }
< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319