C# для профессионалов. Том II - [3]

Шрифт
Интервал

>   doc=new DOMDocument30();

>   doc.load("..\\..\\..\\books.xml")

Следующие строки объявляют, что узлы являются >nodeList узлов книг. В данном случае имеется три узла:

>   IXMLDOMNodeList nodes;

>   nodes = doc.selectNodes("bookstore/book");

>   IXMLDOMNode node=nodes.nextNode();

Мы просматриваем узлы в цикле и добавляем текстовое значение атрибута ISBN в >listBox1:

>   while(node!=null) {

>    listBox1.Items.Add(node.attributes.getNamedItem("ISBN").text);

>    node=nodes.nextNode();

>   }

>  }

> }

>}

Вот как выглядит пример во время выполнения:

Это изображение появляется после того, как была нажата кнопка button1 и загрузился listBox1 с номерами ISBN книг. После выбора номера ISBN будет выведено следующее:

System.Xml

Пространство имен >System.Xml является мощным и относительно простым для использования, но оно отличается от модели MSXML 3.0. Если вы знакомы с MSXML 3.0, то применяйте его, пока не освоитесь с пространством имен >System.Xml. Пространство имен >System.Xml предлагает большую гибкость и легче расширяется.

Этот файл XML будет использоваться в примерах этой главы. Код, который только что был рассмотрен, лежит в основе нескольких примеров. В большинстве других будет показан только код, имеющий отношение к делу, и не будет повторяться то, что уже было показано.

Чтение и запись XML

Теперь посмотрим, что позволяет делать платформа .NET. Если раньше вы работали с SAX, то >XmlReader и >XmlWriter вам будут знакомы. Классы на основе >XmlReader предоставляют быстрый курсор только для чтения вперед, который создает поток данных XML для обработки. Так как это потоковая модель, то требования к памяти не очень большие. Однако в ней отсутствует навигационная гибкость и средства чтения/записи, присущие модели DOM. Классы на основе >XmlWriter будут создавать документ XML, который соответствует рекомендациям по пространствам имен XML 1.0 консорциума W3C.

>XmlReader и >XmlWriter являются абстрактными классами. Рисунок ниже показывает, какие классы являются производными от >XmlReader и >XmlWriter:

>XmlTextReader и >XmlTextWriter работают либо с объектами на основе потока, либо с объектами на основе >TextReader или >TextWriter. >XmlNodeReader использует >XmlNode вместо потока в качестве своего источника. >XmlValidatingReader добавляет DTD и проверку схем и поэтому предлагает проверку данных. Мы рассмотрим это подробнее позже в этой главе.

XmlTextReader

>XmlTextReader похож на SAX. Одно из различий заключается в том, что SAX является моделью типа рассылки (push), т.е. посылает данные приложению и разработчик должен быть готов принять их, a >XmlTextReader применяет модель запроса (pull), где данные посылаются приложению, которое их запрашивает. Это предоставляет более простую и интуитивно понятную модель для программирования. Другое преимущество состоит в том, что модель запроса может быть избирательной в отношении данных, посылаемых приложению. Если нужны не все данные, то их не нужно обрабатывать. В модели рассылки все данные XML должны быть обработаны приложением, нужны они ему или нет.

Возьмем простой пример считывания данных XML, и затем более внимательно рассмотрим класс >XmlTextReader. Код можно найти в папке >XmlReaderSample1. Можно заменить метод >button1_Click в предыдущем примере на следующий код. Эту версию данного кода можно найти в папке >SampleBase2 загруженного архива кода. Не забудьте изменить:

>using MSXML2;

на

>using System.Xml;

Мы должны это сделать, поскольку используем теперь не MSXML 3.0, а пространство имен >System.Xml. Нужно также удалить метод >listBox1_SelectedIndexChanged, так как он включает в себя некоторые неподдерживаемые методы и строку:

>private DOMDocument30 doc;


>protected void button1_Click(object sender, System.EventArgs e) {

> // Измените этот путь доступа, чтобы найти books.xml

> string fileName = "..\\..\\..\\books.xml";

> // Создать новый объект TextReader

> XmlTextReader tr = new XmlTextReader(fileName);

> // Прочитать узел за раз

> while(tr.Read()) {

>  if (tr.NodeType == XmlNodeType.Text) listBox1.Items.Add(tr.Value);

> }

>}

Это >XmlTextReader в простейшей форме. Сначала создается строковый объект >fileName с именем файла XML. Затем создается новый объект >XmlTextReader, передавая в качестве параметра строку >fileName.XmlTextReader в настоящее время имеет 13 различных перегружаемых конструкторов, которые получают различные комбинации строк (имен файлов и URL), потоков и таблиц имен. После инициализации объекта >XmlTextReader ни один узел не выбран. Это единственный момент, когда узел не является текущим. Когда мы начинаем цикл >tr.Read, первая операция чтения >Read переместит нас в первый узел документа. Обычно это бывает узел Declaration XML. В этом примере при переходе к каждому узлу >tr.NodeType сравнивается с перечислением >XmlNodeType, и когда встречается текстовый узел, значение текста добавляется в >listbox. Вот экран после того, как было загружено окно списка:

Существует несколько способов перемещения по документу. Как мы только что видели, >Read перемещает нас к следующему узлу. Затем можно проверить, имеет ли узел значение (>HasValue) или, как мы скоро увидим, имеет ли узел атрибуты (


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.