[Новые статьи по программированию]

18.09.2012 Статья о реализации обобщенных функторов на C++. Рассмотрены требования обобщенных функторов, проблемы и недостатки существующей реализации. Предложены несколько новых идей и решений проблем вместе с...
20.08.2012 Данная статья расскажет о том, как создать простой веб-сервис с использованием JBossWS, как развернуть и тестировать его.
12.08.2012 Подробное обсуждение того, как VC++ реализует обработку исключений. Исходный код содержит библиотеку обработки исключений для VC++.
11.08.2012 Шаблон класса C++ для математики с фиксированной точкой.
14.04.2012 Данная статья описывает кросс-платформенную среду разработки приложений на основе Harel UML StateChart рыночного качества с открытым исходным кодом под названием StateWizard для разработки параллельны...
06.04.2012 Обстоятельное руководство об указателях функций-членов и реализация делегатов, которая генерирует только два кода операции ассемблера!
20.06.2011 Еще один способ создания делегатов в стиле C# в C++ , используя комбинацию шаблонов и полиморфизм...
20.06.2011 Реализация быстрых делегатов C++, которые являются переносимыми и совместимыми со стандартами C++.

[Новые статьи о Microsoft.NET]

20.08.2012 Данная статья об объединении Silverlight и JavaScript на веб-странице ASP.NET...
19.08.2012 В данной статье мы обсудим разные подходы к слабым событиям.
19.08.2012 В данном разделе рассматриваются проблемы полного обхода LINQ и как можно преодолеть их при помощи DataLoadOptions (варианты загрузки данных.
15.08.2012 Обзор, рассматривающий все варианты интеграции PayPal, направленные главным образом на разработчиков C#.
15.08.2012 В этой статье создается приложение MVC, использующее RSS-ленту (обогащеной сводка сайта).
12.08.2012 В данной статье рассматривается типичная трехслойная архитектура в C# .NET. Это очень полезный метод для программирования из-за легкого сопровождения кода.
12.08.2012 ASP.NET создает много мусора, который некоторые разработчики хотели бы удалить со своей страницы. Заменив метод отображения и используя несколько регулярных выражений, разработчик может полностью из...
12.08.2012 В данной статье рассматривается выявление утечек памяти в приложении .NET.

[Новые статьи о Web-технологиях]

12.08.2012 Создайте вашу собственную разновидность JavaScript при помощи прототипов.
07.05.2011 Компонента Tree (Дерево) в JavaScript, которая реализует алгоритм разметки J.Q.Walker II .
21.11.2009 Краткое руководство по JavaScript для новичков.
23.03.2009 Так же, как электронная почта изменила деловое общение, совместная работа на основе веб-технологий меняет процесс взаимодействия людей и обмена информацией. В качестве хорошего примера рассмотрим возм...
13.02.2009 Возможно вам уже известны основы программирования средств безопасности с помощью Windows® и безопасности ASP.NET, но известно ли вам о дополнительном уровне безопасности, добавляемом Windows Share...
09.02.2009 Частые изменения учетных данных фермы и паролей учетных данных безопасности являются важными мерами поддержания фермы Microsoft Office SharePoint Server (MOSS) в безопасном состоянии. Однако для админ...
03.02.2009 При использовании учетных записей безопасности SharePoint существует большой риск создания слабых конфигураций системы, могущих открыть злоумышленникам всю среду SharePoint. Чтобы помочь пользователям...
02.02.2009 Какие технологии SharePoint подходят для меня? В своих усилиях найти ответ средний читатель, вероятно, продирался через кажущийся бесконечным список категорий, таких как сотрудничество и социальные се...

[Новые статьи по базам данных]

13.04.2009 Когда строки не сохраняются рядом, или если строки разбиты больше чем в один блок, снижается производительность, потому что эти строки требуют дополнительного доступа к блокам.
13.04.2009 Oracle, предоставляет несколько маленьких и изящных средств управления табличными пространствами...
13.04.2009 В предыдущих версиях Oracle, сделать таблицу только для чтения, для других пользователей можно было дав объектные привелегии SELECT пользователю. Но для самого владельца таблица оставалась доступной д...
13.04.2009 Ручное создание базы является одним из показателей профессионализма DBA. Как правило используется мастер создания, предлагаемый Oracle.
09.02.2009 Одними из самых непонятных составных частей SQL Server являются механизмы ведения журнала и восстановления. Складывается впечатление, что сам факт существования журнала транзакций и то, что неправильн...
03.02.2009 Производительность любого приложения базы данных в большой степени опирается на выполнение им запросов. Хотя оптимизатор Oracle идеально подходит для оценки наилучшего возможного плана без какого-либо...
03.02.2009 Эта статья рассказывает о том, как inline-подмена, Real native compilation и использование simple_integer могут улучшить производительность кода. Oracle Database 11g представляет несколько отличных но...
03.02.2009 Хорошая модель и правильный проект базы данных формируют основу информационной системы. Построение слоя данных - часто первый критичный шаг в направлении создания новой системы, который правомерно тре...

[Новые статьи об операционных системах и софте]

23.03.2009 Известно, что доменные службы Active Directory (ADDS) — один из компонентов, обязательных для функционирования инфраструктуры Windows. Если Active Directory выходит из строя, сеть, по большей ча...
27.01.2009 Windows уже довольно давно поставляется в комплекте с интегрированной системой сетевой проверки подлинности и единого входа. До Windows 2000 контроллеры доменов Windows NT предоставляли клиентам Windo...
27.01.2009 С тех пор, как кластеризация впервые появилась в Windows NT 4.0 Enterprise Edition, пользователи жаловались, что ее сложно создавать и еще сложнее обслуживать. Администрирование кластера требовало от...
26.01.2009 И вновь мы возвращаемся к разговору о бета-версии Windows 7. Возвращаемся для того, чтобы поговорить о различных ее секретах и хитростях, позволяющих в ряде случаев существенно упростить работу на ком...
22.01.2009 Windows Server 2008 — новейшая версия серверной платформы Майкрософт, в которую внесены на уровне системы изменения, охватывающие все функциональные участки операционной системы, от управления п...
21.01.2009 Виртуализация серверов обещает существенно повлиять на работу корпоративных отделов ИТ, а Hyper-V с Windows Server 2008 могут сделать это реальностью. Консолидация серверов на меньшее число физических...
21.01.2009 В последнее время идет немало разговоров о виртуализации и основная часть этой дискуссии вертится вокруг виртуализации серверов. Это одна из наиболее интересных тенденций в отрасли, потенциально спосо...
21.01.2009 В прошлый раз мы создали VHD-образ с Window 7 для Virtual PC . Понятное дело, что в виртуальной среде, конечно, есть свои преимущества, но тем не менее, хотелось бы, чтобы все работало пошустрее&helli...

[Новые статьи о железе и сетях]

23.01.2009 Я постараюсь в этой статье подробно описать то, как настроить прокси-сервер и с его помощью на стороне клиента подключаться к сети интернет. Программа, на которой будет осуществляться демонстрация это...
23.01.2009 Как подключить несколько компьютеров между собой и к Интернету, распределяя одинаковую скорость к Интернету? Через такие соединения вы сможете не только пользоваться файлами, расположенными на другом...
13.01.2009 Процессоры Intel Core 2 Duo (и не только они одни!) содержат множество ошибок, приводящих к сбоям программного обеспечения, зависаниям операционной системы и даже возможности удаленного захвата управл...
13.01.2009 Если Вы читаете этот документ, то скорее всего вы подсоединены к Интернету, и используете трансляцию сетевых адресов (Network Address Translation, NAT) прямо сейчас! Интернет стал настолько огромным...
13.01.2009 Используя терминологию Cisco, в контексте NAT есть четыре основных определения для IP-адресов. Рассмотрим их на примере, показанном на рисунке ниже. На обоих маршрутизаторах делается NAT (network addr...
12.01.2009 В данном документе мы рассмотрим, что такое IP фрагментация, как она происходит и почему является нежелательным явлением в сетях, а также рассмотрим пару сценариев как ее предотвратить.
12.01.2009 GRE (Generic Routing Encapsulation) — протокол туннелирования сетевых пакетов, разработанный фирмой Cisco. Протокол GRE обеспечивает механизм инкапсуляции произвольных пакетов в произвольный тра...
12.01.2009 Туннелирование - способ инкапсуляции произвольных пакетов одного протокола в какой-либо другой транспортный протокол. Для упрощения конфигурирования туннелирование реализовано в виде виртуального (лог...

Работа с XML в .NET

ОГЛАВЛЕНИЕ

 

Поиск по документу с XPath

    XML Path Language (XPath) - язык, применяемый для получения наборов узлов XML-документа и адресации частей XML-документа. Он обеспечивает компактный, эффективный, логичный синтаксис для ссылок на узлы документа, тесно связан с XSLT и предоставляет стандартные средства для работы со строками, числами и булевскими значениями.

    Пути в XPath формируются из названий узлов, разделенных слешами. Путь к товару будет описан следующим выражением.

Заказы/Заказ/Товар

    Для идентификации элемента во всех местах документа нужно использовать два слеша в начале выражения:

//Товар 

    Для указания неизвестных элементов в пути можно воспользоваться символом *. Например, можно задать вот такой путь для поиска руководителей отделов

Отделы/*/Руководитель

    Для фильтрации элементов документа нужно использовать предикаты - выражения, заключенные в квадратные скобки. В предикатах могут участвовать атрибуты тегов и значения вложенных тегов. При этом, перед атрибутами тегов, участвующих в фильтрации, ставиться амперсанд @, а перед вложенными тегами - нет. Предикаты можно объединять ключевыми словами or и and. Для нахождения заказов из Москвы или Уфы нужно использовать такое выражение:

Заказы/Заказ[@Адрес = "Уфа" or @Адрес = "Москва"]

    Для работы с XPath в .NET используются классы XPathNavigator и XPathNodeIterator. XPathNavigator выполняет XPath запросы, а перемещение по узлам, полученным в результате запроса осуществляется с помощью XPathNodeIterator. С помощью XPathNavigator можно перемещаться по документу в произвольном направлении. Для перехода к родительскому узлу есть метод MoveToParent, а для переход к первому дочернему узлу - MoveToFirstChild. Свойство HasChildren возвращает true если у текущего узла есть дочерние. Для перебора атрибутов текущего узла есть методы MoveToFirstAttribute, MoveToNextAttribute. В нашей программе мы используем XPath для поиска товаров, стоимостью более 300 рублей, и нахождения их суммарной стоимости. Рассмотрим эту функцию. 

OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "Файлы XML (*.xml)|*.xml"; if (dlg.ShowDialog() ! = DialogResult.OK)
    return;

XmlDocument doc = new XmlDocument();
orders.Clear();

try
{
    doc.Load(dlg.FileName);

    // находим стоимость всех товаров
    XPathNavigator nav = doc.CreateNavigator();
    XPathNodeIterator it = (XPathNodeIterator)nav.Evaluate("Заказы/Заказ/Товар[@Цена > 300]");

    StringBuilder sb = new StringBuilder();
    sb.Append("Дорогие товары:");
    float total = 0;

    while (it.MoveNext())
    {
         sb.AppendFormat("\n{0}", it.Current.GetAttribute("Цена", ""));
         total += float.Parse(it.Current.GetAttribute("Цена", ""));
    }

    sb.AppendFormat("\n--------------------\nИтого: {0} рублей", total);

    // получаем все заказы
    XmlNodeList ordersList = doc.DocumentElement.ChildNodes;

    foreach (XmlNode nodeOrder in ordersList)
    {
        Order order = new Order(nodeOrder.Attributes["Адрес"].Value, DateTime.Parse(nodeOrder.Attributes["Дата"].Value));

        // получаем все товары из заказа
        XmlNodeList goodsList = nodeOrder.ChildNodes;

        foreach (XmlNode nodeGood in goodsList)
            order.AddGood(nodeGood.Attributes["Название"].Value, float.Parse(nodeGood.Attributes["Цена"].Value));

        orders.Add(order);
    }

    ShowOrders();

    // выводим адреса заказов
    MessageBox.Show(sb.ToString());
}
catch (Exception ex)
{
    MessageBox.Show("Ошибка: " + ex.Message);
}

    На первом этапе мы создаем XmlDocument и загружаем XML-файл, указанный пользователем. Объект XPathNavigator создается вызовом метода CreateNavigator. Мы выполнили XPath-запрос с помощью метода Evalate, выполняющим произвольный запрос. Результатом может быть число, строка, булевское значение или набор узлов, как в нашем случае. Этот метод мы выбрали только для примера, т.к. для получения именно набора узлов лучше пользоваться методом Select. Он также принимает строку с XPath выражением, но сразу возвращает объект XPathNodeIterator. В нашем примере мы искали все товары, цена которых более 300 рублей. Для перебора всех узлов, найденных методом Evalate, вызываем метод MoveNext() и для каждого узла получаем значение атрибута Цена. Все найденные цены суммируются, а из значения сохраняются в текстовом виде в StringBuilder.

 

Кондратьев Денис 

Читайте также:
  • Лучшие методы в .NET: выявление утечек памяти приложения
    Загрузить исходный код - WindowsAppMemoryLeak - 34.04 KB Введение Утечки памяти в приложении .NET всегда были кошмаром программистов. Утечки памяти – самые большие проблемы, когда дело касается рабочих серверов. Рабочие сервера, как правило, должны работать с минимальным временем простоя....
  • Оптимизация сериализации в .NET
    Введение Это первая из двух статей про оптимизацию сериализации, особенно для использования в удаленном взаимодействии. Эта первая статья содержит универсальный код, который используется для сохранения 'принадлежащих данных' (определяются позже) в компактную структурную единицу с максима...
  • Плавающая точка в .NET - часть 1: принципы и форматы
    Обзор Арифметические операции с плавающей точкой в большинстве случаев считаются довольно скрытой темой. При этом широкие спектры повседневных приложений не просто используют арифметические операции с плавающей точкой - они зависят от них. Целью данной серии из трех статей является раскрыть мате...
  • JIT-оптимизации
    Данное преимущество делает свойства JIT столь секретными и JIT-оптимизации настолько мистическими. Это также является причиной того, почему SSCLI (Rotor) содержит всего лишь наивную реализацию быстрого JIT, которая производит только минимальные оптимизации при трансляции каждой команды IL в ее ...
  • Инъекции CLR: замена методов во время выполнения
    Компилятор JITMicrosoft Intermediate Language или MSIL (более известен как Common Intermediate Language (CIL)) является языком низшего уровня, типа ассемблера. Все языки .NET компилируются в MSIL (с некоторыми исключениями C++/CLI). Процессоры не могут выполнять MSIL напрямую (может, для .NET в буду...