///
/// Главная точка входа для приложения.
///
[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. Классы на основе XmlWriter
будут создавать документ XML, который соответствует рекомендациям по пространствам имен XML 1.0 консорциума W3C.
XmlReader
и XmlWriter
являются абстрактными классами. Рисунок ниже показывает, какие классы являются производными от XmlReader
и XmlWriter
:
XmlTextReader
и XmlTextWriter
работают либо с объектами на основе потока, либо с объектами на основе TextReader
или TextWriter
. XmlNodeReader
использует XmlNode
вместо потока в качестве своего источника. XmlValidatingReader
добавляет DTD и проверку схем и поэтому предлагает проверку данных. Мы рассмотрим это подробнее позже в этой главе.
XmlTextReader
XmlTextReader
похож на SAX. Одно из различий заключается в том, что SAX является моделью типа рассылки (push), т.е. посылает данные приложению и разработчик должен быть готов принять их, a XmlTextReader
применяет модель запроса (pull), где данные посылаются приложению, которое их запрашивает. Это предоставляет более простую и интуитивно понятную модель для программирования. Другое преимущество состоит в том, что модель запроса может быть избирательной в отношении данных, посылаемых приложению. Если нужны не все данные, то их не нужно обрабатывать. В модели рассылки все данные XML должны быть обработаны приложением, нужны они ему или нет.