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

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

). Существует метод >ReadStartElement, который проверяет, является ли текущий узел начальным элементом, и затем перемешает текущую позицию к следующему узлу. Если текущая позиция не является начальным элементом, то порождается исключение >XmlException. Этот метод совпадает с вызовом метода >IsStartElement, за которым следует метод >Read.

Методы >ReadString и >ReadCharts считывают текстовые данные из элемента. >ReadString возвращает строковый объект, содержащий данные, в то время как >ReadCharts считывает данные в заданный массив символов.

Метод >ReadElementString аналогичен методу >ReadString, за исключением того, что при желании можно передать в него имена элемента. Если следующий узел содержимого не является начальным тегом или, если параметр >Name не совпадает с именем (>Name) текущего узла, то порождается исключение. Вот пример того, как это может использоваться (код можно найти в папке >XmlReaderSample2):

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

> // Использовать файловый поток для получения данных

> FileStream fs = new FileStream("..\\..\\..\\books.xml", FileMode.Open);

> XmlTextReader tr = new XmlTextReader(fs);

> while(!tr.EOF) {

>  // если встретился тип элемента, проверить и загрузить его в окно списка

>  if (tr.MoveToContent()==XmlNodeType.Element && tr.Name=="title") {

>   listBox1.Items.Add(tr.ReadElementString());

> } else

>  //иначе двигаться дальше

>  tr.Read();

> }

>}

В цикле >while используется метод >MoveToContent для поиска каждого узла типа >XmlNodeType.Element с именем >title. Если это условие не выполняется, то предложение >else вызывает метод >Read для перехода к следующему узлу. Если будет найден узел, соответствующий критерию, то результат работы метода >ReadElementString добавляется в >listbox. Таким образом мы получим заглавия книг в >listbox. Отметим, что после успешного применения >ReadElementString метод >Read не вызывается. Это связано с тем, что метод >ReadElementString обрабатывает весь >Element и перемещается к следующему узлу.

Если удалить >&& tr.Name=="title" из предложения >if, то придется отслеживать исключение >XmlException, когда оно будет порождаться. При просмотре файла данных можно заметить, что первым элементом, который найдет метод MoveToContent, является элемент >. Как элемент он будет проходить проверку в операторе >if. Но так как он не содержит простой текстовый тип, он вынуждает метод >ReadElementString порождать исключение >XmlException. Одним из способов обхода этой проблемы является размещение вызова >ReadElementString в своей собственной функции. Назовем ее >LoadList. >XmlTextReader передается в нее в качестве параметра. Теперь, если вызов >ReadElementString отказывает внутри этой функции, мы можем иметь дело с ошибкой и вернуться назад в вызывающую функцию. Вот как выглядит пример с этими изменениями (код можно найти в папке >XmlReaderSample3):

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

> // использовать файловый поток для получения данных

> FileStream fs = new FileStream("..\\..\\..\\books.xml", FileMode.Open);

> XmlTextReader tr = new XmlTextReader(fs);

> while(!tr.EOF) {

>  // если встретился тип элемента, проверить и загрузить его в окно списка

>  if (tr.MoveToContent() == XmlNodeType.Element) {

>   LoadList(tr);

>  } else

>   // иначе двигаться дальше

>   tr.Read();

> }

>}

>private void LoadList(XmlReader reader) {

> try {

>  listBox1.Items.Add(reader.ReadElementString());

> }

> //если инициировано исключение XmlException, игнорировать его.

> catch(XmlException er){}

>}

Вот что должно появиться, когда код будет выполнен:

Это тот же результат, который был раньше. Мы видим, что существует более одного способа достичь одной и той же цели. При этом становится очевидной гибкость пространства имен >System.Xml.

По мере чтения узлов можно заметить отсутствие каких-либо атрибутов. Это связано с тем, что атрибуты не считаются частью структуры документа. При нахождении в узле элемента мы можем проверить наличие атрибутов и получить значения атрибутов. Метод >HasAttributes возвращает >true, если существуют какие-либо атрибуты, иначе возвращается >false. Свойство >AttributeCount сообщит, сколько имеется атрибутов. Метод >GetAttribute получает атрибут по имени или по индексу. Если желательно просмотреть все атрибуты по очереди, можно использовать методы >MoveToFirstAttribute (перейти к первому атрибуту) и >MoveToNextAttribute (перейти к следующему атрибуту). Вот пример просмотра атрибутов из >XmlReaderSample4:

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

> // задаем путь доступа в соответствии со структурой путей доступа

> // к данным

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

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

> XmlTextReader tr = new XmlTextReader(filename);

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

> while (tr.Read()) {

>  // проверить, что это элемент NodeType

>  if (tr.NodeType = XmlNodeType.Element) {

>   // если это — элемент, то посмотрим атрибуты

>   for(int i=0; i

>    listBox1.Items.Add(tr.GetAttribute(i));

>   }

>  }

> }

>}

На этот раз мы ищем узлы элементов. Когда такой узел найден, в цикле просматриваются все атрибуты и с помощью метода


Рекомендуем почитать
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ

В наши дни компьютеры с несколькими многоядерными процессорами стали нормой. Стандарт С++11 языка С++ предоставляет развитую поддержку многопоточности в приложениях. Поэтому, чтобы сохранять конкурентоспособность, вы должны овладеть принципами и приемами их разработки, а также новыми средствами языка, относящимися к параллелизму.Книга «Параллельное программирование на С++ в действии» не предполагает предварительных знаний в этой области. Вдумчиво читая ее, вы научитесь писать надежные и элегантные многопоточные программы на С++11.


Дефрагментация мозга. Софтостроение изнутри

Эта книга для тех, кто давно связан с разработкой программного обеспечения. Или для тех, кто еще думает выбрать программирование своей профессией. Или для тех, кто просто привык думать и размышлять о происходящем в мире информационных технологий.Не секрет, что основная масса софтостроения сосредоточена в секторе так называемой корпоративной разработки: от комплексных информационных систем предприятия до отдельных приложений. Поэтому немалая часть сюжетов касается именно Enterprise Programming.Из текста вы вряд ли узнаете, как правильно склеивать многоэтажные постройки из готовых компонентов в гетерогенной среде, проектировать интерфейсы, синхронизировать процессы или писать эффективные запросы к базам данных.


Справочник по JavaScript

Вниманию читателей предлагается справочник по JavaScript.Справочник предназначается для людей, уже освоивших азы программирования в JavaScript.Справочник создан на основе информации, предоставленной на сайте «Справочник Web-языков» www.spravkaweb.ru.Дата выхода данной версии справочника: 12:33, 21 марта 2007.


Справочник по PHP

Вниманию читателей предлагается справочник по PHP.Справочник предназначается для людей, уже освоивших азы программирования на языке PHP.Справочник создан на основе информации, предоставленной на сайте «Справочник Web-языков» www.spravkaweb.ru.


Fiction Book Designer Краткое руководство

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


Программирование на Visual C++. Архив рассылки

РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.