выбрать? Если данные, которые желательно поместить в XML, доступны и готовы для записи, то самым подходящий будет класс XmlTextWriter
. Однако, если необходимо создавать документ XML постепенно, вставляя узлы в различные места, то наиболее приемлемым будет применение XmlDocument
. Вот тот же пример, который только что был рассмотрен, но вместо редактирования текущего документа мы создаем новый документ (DOMSample4
):
private void button1_Click(object sender, System.EventArgs e) {
// создать раздел объявлений
XmlDeclaration newDoc=doc.CreateXmlDeclaration('1.0', null, null);
doc.AppendChild(newDoc);
// создать новый корневой элемент
XmlElement newRoot=doc.CreateElement('newBookstore');
doc.AppendChild(newRoot);
// создать новый элемент 'book'
XmlElement newBook=doc.CreateElement('book');
// создать и задать атрибуты элемента 'book'
newBook.SetAttribute('genre','Mystery');
newBook.SetAttribute('publicationdate', '2001');
newBook.SetAttribute('ISBN', '123456789');
// создать элемент 'title'
XmlElement newTitle=doc.CreateElement('title');
newTitle.InnerText='Case of the Missing Cookie';
newBook.AppendChild(newTitle);
// создать элемент author
XmlElement newAuthor=doc.CreateElement('author');
newBook.AppendChild(newAuthor);
// создать элемент name
XmlElement newName=doc.CreateElement('name');
newName.InnerText='C. Monster';
newAuthor.AppendChild(newName);
// создать элемент price
XmlElement newPrice=doc.CreateElement('price');
newPrice.InnerText='9.95';
newBook.AppendChild(newPrice);
// добавить элемент 'book' к doc
doc.DocumentElement.AppendChild(newBook);
// записать на диск Note новое имя файла booksEdit.xml
XmlTextWriter tr=new XmlTextWriter('..\..\..\booksEdit.xml', null);
tr.Formatting=Formatting.Indented; doc.WriteContentTo(tr);
tr.Close();
// загрузить заголовок в окно списка
XmlNodeList nodeLst=doc.GetElementsByTagName('title');
foreach(XmlNode node in nodeLst) listBox1.Items.Add(node.InnerText);
}
private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) {
String srch='newBookstore/book[title=''+ listBox1.SelectedItem.ToString() + '']';
XmlNode foundNode=doc.SelectSingleNode(srch);
if (foundNode!=null) MessageBox.Show(foundNode.InnerText);
else MessageBox.Show('Not found');
}
Заметим, что изменились только две начальные строки. Прежде чем сделать doc.Load
, внесем новые элементы:
XmlDeclaration newDoc=doc.CreateXmlDeclaration('1.0', null, null);
doc.AppendChild(newDoc);
XmlElement newRoot=doc.CreateElement('newBookstore');
doc.AppendChild(newRoot);
Сначала создается новый объект XmlDeclaration
. Параметрами являются версия (в настоящее время всегда '1.0'
), кодировка (null
подразумевает UTF- 8
) и, наконец, флаг standalone
. Он может быть yes
или no
, но если вводится null или пустая строка, как в нашем случае, этот атрибут не будет добавляться при сохранении документа. Параметр кодировки должен задаваться строкой, которая является частью класса System.Text.Encoding
, если не используется null
.
Следующим создаваемым элементом станет DocumentElement
. В данном случае мы называем его newBookstore
, чтобы можно было видеть различие. Остальная часть кода является такой же, как и в предыдущем примере, и работает точно так же. Вот файл booksEdit.xml
, создаваемый этим кодом:
<?xml version='1.0'?>
<newBookstore>
<book genre='Mystery' publicationdate='2001' ISBN='123456789'>
<title>Case of the Missing Cookie</title>
<author>
<name>C. Monster</name>
</author>
<price>9.95</price>
</book>
</newBookstore>
Мы не рассмотрели всех особенностей класса XmlDocument
или других классов, способствующих созданию модели DOM в .NET. Однако мы видели мощь и гибкость, которые предлагает реализация DOM в .NET. Класс XmlDocument
обычно используется, когда требуется случайный доступ к документу. Используйте классы на основе XmlReader
, когда желательна модель потокового типа. Помните, что гибкость XmlDocument
на основе XmlNode
обеспечивается более высокими требованиями к памяти, поэтому подумайте тщательно о том, какой метод предпочтительнее в конкретной ситуации.
XPath и XslTransform
Мы рассмотрим XPath
и XslTransform
вместе, хотя они являются отдельными пространствами имен на платформе. XPath
содержится в System.Xml.XPath
, a XslTransform
находится в System.Xml.Xsl
. Причина совместного рассмотрения состоит в том, что XPath
, в частности класс XPathNavigator
, предоставляет ориентированный на производительность способ выполнения XSLTransform
в .NET. Для начала рассмотрим XPath
, а затем его использование в классах System.Xsl
.
Пространство имен XPath
создается для скорости. Оно позволяет только читать документы XML без возможностей редактирования. XPath
создается для поверхностного выполнения быстрых итераций и выбора в документе XML. Функциональность XPath