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

стр.

>

>   // InitializeComponent

>   //

>  }


>  /// 

>  /// Очистить все использованные ресурсы.

>  ///

>  public override void Disposed {

>   base.Dispose();

>   if (components != null) components.Dispose();

>  }


>#region Windows Form Designer создает код


>  ///

>  /// Необходимый для поддержки Designer метод — не изменяйте

>  /// содержимое этого метода редактором кода.

>  ///

>  private void InitializeComponent() {

>   this.listBox1 = new System.Windows.Forms.ListBox();

>   this.button1 = new System.Windows.Forms.Button();

>   this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles.Top |

>    System.Windows.Forms.AnchorStyles.Left) |

>    System.Windows.Forms.AnchorStyles.Right);

>   this.listBox1.Size = new System.Drawing.Size(336, 238);

>   this.listBox1.TabIndex = 0;

>   this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);

>   this.button1.Anchor = System.Windows.Forms.AnchorStyles.Bottom;

>   this.button1.Location = new System.Drawing.Point(136, 264);

>   this.button1.TabIndex = 1;

>   this.button1.Text = "button1";

>   this.button1.Click += new System.EventHandler(this.button1_Click);

>   this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

>   this.ClientSize = new System.Drawing.Size(339, 320);

>   this.Controls.AddRange(new System.Windows.Forms.Control[]{this.button1, this.listBox1});

>   this.Text = "Form1";

>  }

>#endregion


>  /// 

>  /// Главная точка входа для приложения.

>  ///

>  [STAThread]

>  static void Main() {

>   Application.Run(new Form1());

>  }

Мы хотим взять номер ISBN из >listbox и, используя простой поиск >XPath, найти узел книги, который ему соответствует, и вывести текст узла (заглавие книги и цену) в >MessageBox. Язык пути доступа XML (XPath) является нотацией XML, которая может использоваться для запроса и фильтрации текста в документе XML. Рассмотрим XPath в .NET позже в этой главе. Вот код обработчика событий для выбора записи в окне списка:

>  protected void listBox1_SelectedIndexChanged (object sender, System.EventArgs e){

>   string srch=listBox1.SelectedItem.ToString();

>   IXMLDOMNode nd=doc.selectSingleNode("bookstore/book[@ISBN='" + srch + "']");

>   MessageBox.Show(nd.text);

>  }

Теперь мы имеем обработчик события нажатия кнопки. Сначала мы загружаем файл >books.xml — обратите внимание, что если файл выполняется не в папке >bin/debug или >bin/release, необходимо исправить соответствующим образом путь доступа:

>  protected void button1_Click(object sender, System.EventArgs e) {

>   doc=new DOMDocument30();

>   doc.load("..\\..\\..\\books.xml")

Следующие строки объявляют, что узлы являются >nodeList узлов книг. В данном случае имеется три узла:

>   IXMLDOMNodeList nodes;

>   nodes = doc.selectNodes("bookstore/book");

>   IXMLDOMNode node=nodes.nextNode();

Мы просматриваем узлы в цикле и добавляем текстовое значение атрибута ISBN в >listBox1:

>   while(node!=null) {

>    listBox1.Items.Add(node.attributes.getNamedItem("ISBN").text);

>    node=nodes.nextNode();

>   }

>  }

> }

>}

Вот как выглядит пример во время выполнения:

Это изображение появляется после того, как была нажата кнопка button1 и загрузился listBox1 с номерами ISBN книг. После выбора номера ISBN будет выведено следующее:

System.Xml

Пространство имен >System.Xml является мощным и относительно простым для использования, но оно отличается от модели MSXML 3.0. Если вы знакомы с MSXML 3.0, то применяйте его, пока не освоитесь с пространством имен >System.Xml. Пространство имен >System.Xml предлагает большую гибкость и легче расширяется.

Этот файл XML будет использоваться в примерах этой главы. Код, который только что был рассмотрен, лежит в основе нескольких примеров. В большинстве других будет показан только код, имеющий отношение к делу, и не будет повторяться то, что уже было показано.

Чтение и запись XML

Теперь посмотрим, что позволяет делать платформа .NET. Если раньше вы работали с SAX, то >XmlReader и >XmlWriter вам будут знакомы. Классы на основе >XmlReader предоставляют быстрый курсор только для чтения вперед, который создает поток данных XML для обработки. Так как это потоковая модель, то требования к памяти не очень большие. Однако в ней отсутствует навигационная гибкость и средства чтения/записи, присущие модели DOM. Классы на основе