Я увидел статью в Интернете и попробовал сам. Конечно же, XMLTextReader быстрее!
Класс XMLTextReader, включенный в пространство имен System.XML .NET Framework, может быстро считывать данные из файлов XML, не требуя при этом особых требований к системным ресурсам. Используйте класс XMLTextReader для чтения данных из файлов XML и преобразования их в формат HTML для вывода в браузере.
Прежде чем читать эту статью, читателям необходимо иметь некоторые базовые знания: XML, HTML, язык программирования C#, а также некоторые знания о .NET, особенно о платформе ASP.NET.
Платформа .NET Microsoft предоставляет разработчикам множество удобств для разработки. Поскольку важность XML продолжает расти, разработчики с нетерпением ждут разработки полного набора мощных инструментов XML. Платформа .NET оправдала наши ожидания и организовала следующие классы для XML в пространстве имен System.XML:
XMLTextReader ------ Обеспечивает быстрый односторонний небуферизованный доступ к XML-данным. (Односторонний означает, что вы можете читать XML-файл только спереди назад, а не наоборот.)
XMLValidatingReader ------ Используемый с классом XMLTextReader, он обеспечивает возможность проверки схем DTD, XDR и XSD.
XMLDocument ------ соответствует основным и дополнительным стандартам спецификации объектной модели документов W3C для достижения произвольного и кэшированного доступа к данным XML. Первый уровень содержит самые основные части DOM, а второй уровень добавляет множество улучшений, включая поддержку пространств имен и каскадных диаграмм (CSS).
XMLTextWriter ------Создание XML-файлов, соответствующих спецификации W3C XML 1.0.
В этой статье в основном говорится о первом классе XMLTextReader. Целью этого класса является быстрое чтение данных из XML-файлов без высоких требований к системным ресурсам (в основном, включая память и процессорное время). Под управлением родительской программы он реализует этот рабочий процесс, постепенно обрабатывая XML-файл, обрабатывая только один узел за раз. В каждом узле XML-файла родительская программа может определить тип узла, его атрибуты и данные (если таковые имеются), а также другую информацию об узле. На основе этой информации родительская программа может выбрать, обрабатывать ли этот узел или игнорировать информацию об узле для удовлетворения потребностей различных запросов приложений. Это называется моделью обработки по запросу, поскольку родительская программа делает запрос и извлекает отдельные узлы из XML-файла, а затем обрабатывает его или не обрабатывает по мере необходимости.
Мы можем сравнить класс XMLTextReader с XML Simple Application Programming Interface (SAX) — еще одной технологией чтения XML-данных, очень популярной среди программистов. XMLTextReader и SAX очень похожи в том, что они могут быстро читать данные из файлов XML, не занимая при этом много системных ресурсов. Однако, в отличие от модели извлечения XMLTextReader, SAX использует модель push: процессор XML использует «события», чтобы сообщить главному приложению, какие данные узла доступны, а какие не могут быть получены по мере необходимости, главная программа соответственно реагирует или игнорирует их; . Другими словами, данные передаются от обработчика SAX на хост. Программистам приходится спорить о том, имеют ли модели обработки с выдвижением или с вставкой больше преимуществ, но нельзя отрицать, что обе модели работают хорошо. .NET Framework не поддерживает SAX, но вы можете использовать существующие инструменты SAX, такие как анализатор MSXML, с вашими .NET-приложениями.
Класс XMLTextReader имеет конструкторы для различных ситуаций, таких как чтение данных из существующего потока данных или универсального локатора ресурсов. Чаще всего вам может потребоваться прочитать данные XML из файла, и для этого существует соответствующий конструктор. Вот пример (все мои примеры кода написаны на C#, их легко преобразовать, если вы предпочитаете использовать VISUAL BASIC).
XMLTextReader myReader;
myReader = New XMLTextReader("c:datasales.XML")
создает цикл, называемый методом Read(). Возвращаемое значение этого метода всегда истинно, пока оно не достигнет конца файла, когда возвращаемое значение станет ложным. . Другими словами, цикл начинается с начала файла и считывает все узлы по одному, пока не будет достигнут конец файла:
While (myReader.Read()) {
...
// Здесь обрабатываем каждый узел.
...
}
После каждого успешного вызова Read() программа создания экземпляра XMLTextReader содержит информацию о текущем узле (то есть узле, только что прочитанном из файла). Мы можем получить вышеуказанную информацию от членов XMLTextReader, как описано в таблице 1, и определить тип текущего узла через атрибут NodeType; В зависимости от типа узла программный код может считывать данные узла, проверять, есть ли у него атрибуты, игнорировать их или выполнять соответствующие операции и обработку в соответствии с потребностями программы.
При использовании атрибута NodeType важно понимать, как узлы связаны с ячейками XML. Например, посмотрите на следующий XML-элемент:
<city>Chongqing</city>
XMLtextReader рассматривает этот элемент как 3 узла в следующем порядке:
1. Тег <city> считывается как узел типа XMLNodeType.Element, а имя элемента «city» можно получить из атрибута Name XMLTextReader.
2. Текстовые данные «Чунцин» считываются как узел типа XMLNodeType.Text. Данные «Чунцин» можно получить из атрибута Value XMLTextReader.
3. Тег </city> считывается как узел типа XMLNodeType.EndElement. Аналогично, имя элемента «city» доступно из свойства Name XMLTextReader.
Это три важных типа узлов. Другие типы подробно описаны в документации .NET. См. соответствующую информацию.
Если XMLTextReader обнаруживает ошибку, например нарушение синтаксиса XML, он генерирует исключение типа System.XML.XMLException. Код, использующий этот класс, всегда должен быть защищен (в блоке Try...Catch), как вы увидите позже в демонстрационной программе.
Эта статья представляет собой довольно простое введение в класс XMLTextReader. Класс XMLTextReader имеет довольно много членов, и невозможно упомянуть их все здесь. XMLTextReader обеспечивает значительную гибкость при чтении данных XML. Несмотря на это, я все еще много говорил о том, чтобы читатели могли писать программы для решения задач, которые часто требуются в реальном мире, а именно считывать данные из файла XML и затем выводить их в формате HTML для реализации в браузере. отображать.
Эта программа ASP.NET (скрипт) запускается на сервере и генерирует HTML-страницу обратно в браузер. Скрипт приведен во фрагменте 1, а файл данных XML, с которым он работает, — во фрагменте 2. Вы можете видеть, что этот XML-файл содержит список отношений; цель программы — отобразить этот список, отформатированный так, чтобы нам было легче его видеть.
Запустите программу:
1. Сохраните фрагмент кода 1 как файл XMLTextReader.ASPx, а фрагмент кода 2 — как файл XMLData.XML.
2. Поместите оба файла в виртуальную папку на веб-сервере, на котором установлена .NET Framework.
3. Откройте Internet Explorer и перейдите к файлу ASPx, например, на сервере локальной сети URL-адрес будет http://localhost/xmltextreader.ASPx ;.
Большую часть работы программы выполняет класс XMLDisplay, а именно метод ProcessXML(). Он считывает XML-данные одного узла за раз. Для интересующего элемента данные узла и имя узла, за которым следует двоеточие, будут записаны в выходной результат вместе с соответствующим тегом форматирования HTML. На этом этапе «выходной результат» состоит из объекта StringBuilder, в котором временно сохраняется HTML-текст.
Метод ProcessXML() вызывается из метода LoadDocument(). Задача, выполняемая этим методом, — создать программу создания экземпляра XMLTextReader и загрузить XML-файл перед вызовом ProcessXML. Он также обрабатывает исключения, а затем генерирует сообщения об ошибках и отображает их в браузере. В конечном итоге метод возвращает строку, содержащую либо сгенерированный HTML-контент, либо сообщение об ошибке, если произошло исключение.
Выполнение программы начинается с программы Page_Load(). Когда браузер запрашивает просмотр этой страницы, этот шаг будет выполнен автоматически. Код здесь создает экземпляр класса XMLDisplay и вызывает его метод LoadDocument(). Если все работает нормально, возвращаемое форматированное значение HTML будет скопировано в тег <div> на странице, а сгенерированный HTML-документ будет отправлен обратно в браузер и отображен.
Как другие классы .NET Framework, такие как класс XMLDocument, выполняют чтение XML-данных? Класс XMLDocument отличается от класса XMLTextReader тем, что он создает в памяти дерево узлов всего XML-документа. Таким образом, данные XML могут быть получены случайным образом (полная противоположность линейному способу, которым класс XMLTextReader получает данные), и он обладает идеальной гибкостью при изменении данных и структуры файла XML. Кроме того, XMLDocument позволяет выполнять преобразования XSLT, но эти дополнительные функции предоставляются за счет более медленной скорости работы и большего использования системных ресурсов.
Фрагмент кода 1: XmlTextReader.aspx
<%@ Import Namespace="System.Xml" %>
<script Language="C#" runat=server>
общедоступный класс XmlDisplay
file://Этот класс читает и обрабатывает XML-файлы.
{
общедоступная строка LoadDocument (String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = новый StringBuilder();
пытаться {
file:// создает экземпляр XMLTextReader.
xmlReader = новый XmlTextReader (XmlFileName);
// Обработка XML-файлов
html.Append(ProcessXml(xmlReader));
}
поймать (XmlException ex) {
html.Append("Произошло исключение XML: " +
ex.ToString());
}
поймать (Исключение ex) {
html.Append("Произошло распространенное исключение: " +
ex.ToString());
}
окончательно
{
если (xmlReader!= ноль)
xmlReader.Закрыть();
}
вернуть html.ToString();
}
частная строка ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder()
file://Этот метод считывает XML-файл и генерирует выходной HTML-документ.
пока (xmlReader.Read())
{
// Обрабатываем начало узла элемента.
если (xmlReader.NodeType == XmlNodeType.Element)
{
file://игнорирует элементы <people> и <person>
if ((xmlReader.Name != "человек") && (xmlReader.Name != "люди"))
{
file://Если это элемент <category>, начать новый абзац
if (xmlReader.Name == "категория" )
temp.Append("<p>");
file://добавляет имена элементов в вывод
temp.Append( xmlReader.Name + ": ");
}
}
// Обработка текстовых узлов
иначе, если (xmlReader.NodeType == XmlNodeType.Text)
temp.Append(xmlReader.Value + "<br>");
file:// обрабатывает конец узла элемента
иначе, если (xmlReader.NodeType == XmlNodeType.EndElement)
{
Если file:// является узлом <email>, добавьте тег для завершения абзаца.
if (xmlReader.Name == "электронная почта" )
temp.Append("</p>");
}
}//Завершаем цикл while
return temp.ToString();
} file://Завершить метод ProcessXML
} file://Завершить класс XmlDisplay
Private void Page_Load(Object sender, EventArgs e){
file://Создайте экземпляр класса XmlDisplay
XmlDisplay XmlDisplayDemo = новый XmlDisplay();
output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}
</скрипт>
<html>
<голова>
</голова>
<тело>
<h2>Демо-класс XmlTextReader</h2>
<div id="output" runat="server"/>
</тело>
</html>
1 static void Main(string[] args)
2 {
3 ДатаВремя d1 =ДатаВремя.Сейчас;
4 XmlDocumentTest();
5 ДатаВремя d2 =ДатаВремя.Сейчас;
6 TimeSpan ts =d2-d1;
7
8 Console.WriteLine(ts.TotalMilliсекунды);
9 Консоль.Чтение();
10
11 }
12
13
14 общедоступная статическая строка XmlFileName = "../../XML/1.xml";
15
16 частная статическая пустота XmlTextReaderTest()
17 {
18 Читатель XmlTextReader = новый XmlTextReader(XmlFileName);
19 пока (reader.Read() )
20 {
21 логический выход = ложь;
22 переключатель (читатель.NodeType)
двадцать три {
24 случай XmlNodeType.Element:
25 перерыв;
26 случай XmlNodeType.Text:
27 если (reader.Value=="последний")
28 {
29 выход=истина;
30}
31 перерыв;
32 случай XmlNodeType.EndElement:
33 перерыв;
34 по умолчанию:
35 перерыв;
36}
37 если(выход)
38 {
39 возвращение;
40
41 }
42
43}
44}
45
46 частная статическая пустота XmlDocumentTest()
47 {
48 XmlDocument xd = новый XmlDocument();
49 xd.Load(XmlFileName);
50 XmlNode node = xd.SelectSingleNode("/people/person[category='last']");
51 Console.Write(узел.Имя);
52 }
Оказывается, первый занимает много времени:
Оказывается, второй требует много времени:
http://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html.