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

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

Жанры

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
.

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

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Орден Багровой бури. Книга 5

Ермоленков Алексей
5. Орден Багровой бури
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Орден Багровой бури. Книга 5

Адвокат Империи 7

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

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Вспоминай меня ночью

Рам Янка
Любовные романы:
современные любовные романы
эро литература
5.60
рейтинг книги
Вспоминай меня ночью

Адвокат вольного города 3

Кулабухов Тимофей
3. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 3

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Адвокат вольного города 4

Кулабухов Тимофей
4. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 4

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Баронесса. Эхо забытой цивилизации

Верескова Дарья
1. Проект «Фронтир Вита»
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Баронесса. Эхо забытой цивилизации

Неудержимый. Книга XVII

Боярский Андрей
17. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVII

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений