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

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

Жанры

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
.

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

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Вечная Война. Книга V

Винокуров Юрий
5. Вечная Война
Фантастика:
юмористическая фантастика
космическая фантастика
7.29
рейтинг книги
Вечная Война. Книга V

Генерал Скала и сиротка

Суббота Светлана
1. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Генерал Скала и сиротка

Сумеречный Стрелок 3

Карелин Сергей Витальевич
3. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 3

Студент

Гуров Валерий Александрович
1. Студент
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Студент

Наизнанку

Юнина Наталья
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Наизнанку

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Наследник с Меткой Охотника

Тарс Элиан
1. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник с Меткой Охотника

Восход. Солнцев. Книга IV

Скабер Артемий
4. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IV

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Егерь

Астахов Евгений Евгеньевич
1. Сопряжение
Фантастика:
боевая фантастика
попаданцы
рпг
7.00
рейтинг книги
Егерь

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16