Чтение онлайн

на главную - закладки

Жанры

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

Ватсон Карли

Шрифт:

Существует несколько способов перемещения по документу. Как мы только что видели,

Read
перемещает нас к следующему узлу. Затем можно проверить, имеет ли узел значение (
HasValue
) или, как мы скоро увидим, имеет ли узел атрибуты (
HasAttributes
). Существует метод
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, является элемент
<bookstore>
. Как элемент он будет проходить проверку в операторе
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<tr.AttributeCount; i++) {

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

}

}

 }

}

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

GetAttribute
значение атрибута загружается в
listbox
.

Поделиться:
Популярные книги

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга IV

Альмар. Мой новый мир. Дилогия

Ищенко Геннадий Владимирович
Альмир
Фантастика:
фэнтези
попаданцы
8.09
рейтинг книги
Альмар. Мой новый мир. Дилогия

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Страж Тысячемирья

Земляной Андрей Борисович
5. Страж
Фантастика:
боевая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Страж Тысячемирья

Кристалл Альвандера

Садов Сергей Александрович
1. Возвращенные звезды
Фантастика:
научная фантастика
9.20
рейтинг книги
Кристалл Альвандера

Кодекс Крови. Книга ХII

Борзых М.
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХII

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Черный дембель. Часть 2

Федин Андрей Анатольевич
2. Черный дембель
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Черный дембель. Часть 2

Хроники хвостатых: Ну мы же биджу...

Rana13
Фантастика:
фэнтези
5.00
рейтинг книги
Хроники хвостатых: Ну мы же биджу...

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7

Стратегия обмана. Трилогия

Ванина Антонина
Фантастика:
боевая фантастика
5.00
рейтинг книги
Стратегия обмана. Трилогия

Одержимый

Поселягин Владимир Геннадьевич
4. Красноармеец
Фантастика:
боевая фантастика
5.00
рейтинг книги
Одержимый