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



метод >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