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



, первая операция чтения >Read переместит нас в первый узел документа. Обычно это бывает узел Declaration XML. В этом примере при переходе к каждому узлу >tr.NodeType сравнивается с перечислением >XmlNodeType, и когда встречается текстовый узел, значение текста добавляется в >listbox. Вот экран после того, как было загружено окно списка:

Существует несколько способов перемещения по документу. Как мы только что видели, >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