Maison  >  Article  >  développement back-end  >  Comparaison de XMLTextReader et XmlDocument pour la lecture de fichiers XML

Comparaison de XMLTextReader et XmlDocument pour la lecture de fichiers XML

黄舟
黄舟original
2017-02-28 16:29:561756parcourir

J'ai vu un article sur Internet et je l'ai essayé moi-même. Effectivement, xmlTextReader est plus rapide !

La classe XMLTextReader incluse dans l'espace de noms System.XML du framework .NET peut lire rapidement les données des fichiers XML sans nécessiter de ressources système élevées. Utilisez la classe XMLTextReader pour lire les données des fichiers XML et les convertir au format HTML pour les afficher dans le navigateur.

Avant de lire cet article, les lecteurs doivent comprendre quelques connaissances de base : XML, HTML, langage de programmation C# et une certaine connaissance de .NET, en particulier du framework asp.net.

Le framework .NET de Microsoft offre aux développeurs de nombreuses commodités de développement. Alors que l'importance du XML continue de croître, les développeurs attendent avec impatience le développement d'un ensemble complet d'outils XML puissants. Le framework .NET a répondu à nos attentes et a organisé les classes suivantes pour XML dans l'espace de noms System.XML :

XMLTextReader------fournit un accès rapide et unidirectionnel aux données XML dans un format sans tampon. manière. (Un sens signifie que vous ne pouvez lire le fichier XML que d'avant en arrière, mais pas à l'envers)

XMLValidatingReader------Utilisé avec la classe XMLTextReader, il permet la validation des DTD, XDR et XSD capacité de schémas.

XMLDocument------suit les normes primaires et secondaires de la spécification W3C Document Object Model pour obtenir un accès aléatoire et mis en cache aux données XML. Le premier niveau contient les parties les plus élémentaires du DOM, tandis que le deuxième niveau ajoute une variété d'améliorations, notamment la prise en charge des espaces de noms et des diagrammes en cascade (CSS).

XMLTextWriter------Générer des fichiers XML conformes à la spécification W3C XML 1.0.

Cet article parle principalement de la première classe XMLTextReader. Le but de cette classe est de lire rapidement les données des fichiers XML sans nécessiter de ressources système élevées (y compris principalement des exigences en matière de mémoire et de temps processeur). Sous le contrôle du programme parent, il implémente ce processus de travail en exploitant progressivement le fichier XML en traitant un seul nœud à la fois. Dans chaque nœud du fichier XML, le programme parent peut déterminer le type du nœud, ses attributs et données (le cas échéant), ainsi que d'autres informations sur le nœud. Sur la base de ces informations, le programme parent peut choisir de traiter ce nœud ou d'ignorer les informations du nœud pour répondre aux besoins des diverses demandes d'application. C'est ce qu'on appelle le modèle de traitement pull car le programme parent effectue la requête et extrait les nœuds individuels du fichier XML, puis le traite ou ne le traite pas selon les besoins.
Nous pouvons comparer la classe XMLTextReader avec la XML Simple Application Programming Interface, ou SAX, qui est une autre technologie de lecture de données XML très populaire parmi les programmeurs. XMLTextReader et SAX sont très similaires dans le sens où ils peuvent lire rapidement les données des fichiers XML sans utiliser beaucoup de ressources système. Cependant, contrairement au modèle d'extraction de XMLTextReader, SAX utilise un modèle push : le processeur XML utilise des « événements » pour informer l'application hôte quelles données de nœud sont disponibles et lesquelles ne peuvent pas être obtenues selon les besoins, le programme hôte réagit en conséquence ou les ignore ; . En d'autres termes, les données sont transmises du gestionnaire SAX vers l'hôte. Les programmeurs se demanderont forcément si les modèles de traitement extractible ou push-in présentent plus d'avantages, mais il est indéniable que les deux modèles fonctionnent bien. Le .NET Framework ne prend pas en charge SAX, mais vous pouvez utiliser les outils SAX existants, tels que l'analyseur MSXML, avec vos applications .NET.

La classe XMLTextReader possède des constructeurs pour s'adapter à diverses situations, telles que la lecture de données à partir d'un flux de données existant ou d'un Uniform Resource Locator. Le plus souvent, vous souhaiterez peut-être lire des données XML à partir d'un fichier, et il existe un constructeur correspondant pour le faire. Voici un exemple (tous mes exemples de code sont en C#, ils sont faciles à convertir si vous préférez utiliser VISUAL BASIC).

XMLTextReader myReader;
myReader = New XMLTextReader("c:\data\sales.XML")

Créez une boucle appelée méthode Read(). La valeur de retour de cette méthode est toujours vraie jusqu'à ce que le bas du fichier soit atteint, lorsque la valeur de retour devient fausse. En d'autres termes, la boucle commence au début du fichier et lit dans tous les nœuds, un à la fois, jusqu'à ce qu'elle atteigne la fin du fichier :

While (myReader.Read()) {
...
// 在这里处理每个节点.
...
}

Après chaque appel réussi à Read() , l'instance XMLTextReader L'optimiseur contient des informations sur le nœud actuel (c'est-à-dire le nœud qui vient de lire le fichier). Nous pouvons obtenir les informations ci-dessus auprès des membres de XMLTextReader, comme décrit dans le tableau 1 et déterminer le type du nœud actuel via l'attribut NodeType ; En fonction du type de nœud, le code du programme peut lire les données du nœud, vérifier s'il possède des attributs et s'il doit les ignorer ou effectuer les opérations et traitements correspondants en fonction des besoins du programme.

Lors de l'utilisation de l'attribut NodeType, il est important de comprendre comment les nœuds sont liés aux unités XML. Par exemple, regardez l'élément XML suivant :

<city>Chongqing</city>

XMLtextReader traite cet élément comme 3 nœuds, dans l'ordre suivant :

1. La balise est lue comme un nœud de type XMLNodeType.Element. Le nom de l'élément "city" peut être obtenu à partir de l'attribut Name de XMLTextReader.

  2.文本数据“Chongqing”被读为类型为XMLNodeType.Text的节点。数据“Chongqing ” 可从XMLTextReader 的Value属性中取得。

  3.</city>标签被读为类型为XMLNodeType.EndElement 节点。同样,元素的名称“city”可从XMLTextReader的Name属性中获得。

  这是 3 种重要的节点类型,其它的类型在.NET的说明文档中有详细说明,请大家参阅相关资料。

  如果XMLTextReader遇到一个错误, 例如出现违反XML句法的情况,它抛出一个System.XML.XMLException类型的异常。使用这个类的代码应该总是被保护 ( 在Try……Catch块中),就像你以后在演示程序中看到的一样。
  本文只是一篇相当简单的介绍XMLTextReader 类的文章,XMLTextReader类有相当多的成员,在这里不可能一一述及。当读入XML数据时,XMLTextReader能提供相当强的灵活性。即便如此,我仍然进行了大量的论述,以保证读者能编制程序来实现现实世界中经常要求完成的任务,也就是从一个XML文件读取数据然后以HTML的格式输出,从而实现在浏览器中的显示。

  这个ASP.NET程序(脚本)在服务器上运行并产生一个HTML页面返回浏览器。这段脚本程序在代码段 1 给出,它用来工作使用的 XML 数据文件在代码段 2给出。你能看到这个 XML 文件包含一份表示联系关系的列表;程序的目标即是将这个列表显示出来,为了更容易我们观察,这些列表已经被格式化了。

  运行程序:

  1. 将代码段1存为XMLTextReader.ASPx文件,将代码段2存为XMLData.XML文件。

  2. 把这两个文件都放在一个已经安装好.NET 框架的网络服务器的虚拟文件夹中。

  3. 打开 Internet Explorer 并且浏览这个ASPx文件,例如,在一个局域网服务器上, URL 将是 http://localhost/xmltextreader.ASPx ;。

  程序工作的大部分都由XMLDisplay 类来做,尤其是被PRocessXML()方法完成的。它每次读取一个节点XML数据,对于感兴趣的元素,节点数据和后跟冒号的节点名将和相应的HTML格式化标签一起写入输出结果中。在这阶段,“输出结果”由一个HTML文本暂时储存在其中的StringBuilder对象构成。

  ProcessXML()方法是从LoadDocument()方法调用的。这个方法执行的任务是产生一个XMLTextReader实例化程序并在调用ProcessXML之前装载XML文件。它同时也处理异常,随后产生错误的信息并在浏览器中显示出来。最终该方法返回一个字符串,这个字符串或者包含产生的HTML内容,或者如果异常发生的话就包含出错信息,。

  程序执行以Page_Load()程序开始,当浏览器请求浏览这个页面时,这一步会自动执行。这里的代码实例化了XMLDisplay 类并调用它的LoadDocument()方法。如果一切运行正常的话,格式化的HTML形式的返回值将被拷贝到页面的一个<div>标签中,生成的HTML文档被送回到浏览器中并显示出来。

  其他的.NET 框架的类,比如XMLDocument类在读取XML数据方面表现如何呢?XMLDocument 类与XMLTextReader 类不同,它在存储器中创建整个XML文档的节点树。这样就可以随机的获得XML数据(与XMLTextReader 类获得数据的线性方式正好相反),并且在修改XML文件的数据和结构时,具有非常完美的灵活性。另外,XMLDocument允许执行XSLT 转变,不过,这些额外的功能是以运行速度的降低和系统资源的更多占用为代价的。
  代码段1:XmlTextReader.aspx

<%@ Import Namespace="System.Xml" %>
<script language="C#" runat=server>
public class XmlDisplayfile://这个类读入并处理XML文件。{
public string LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = new StringBuilder();
try {
file://创建XMLTextReader的实例。xmlReader = new XmlTextReader(XmlFileName);
// 处理XML文件html.Append(ProcessXml(xmlReader));
}
catch (XmlException ex){
html.Append("发生一个XML异常:" + ex.ToString());} 
catch (Exception ex){html.Append("发生一个普通异常:" + ex.ToString());} 
finally {if (xmlReader != null)xmlReader.Close();}return html.ToString();}
private string ProcessXml(XmlTextReader xmlReader) 
{StringBuilder temp = new StringBuilder();
file://这个方法读入XML文件并生成输出的HTML文档。
while ( xmlReader.Read() ) {
// 处理一个元素节点的起始。
if (xmlReader.NodeType == XmlNodeType.Element) { 
file://忽略<people>和<person>元素if ((xmlReader.Name != "person") && (xmlReader.Name != "people")) 
{file://如果是一个<category>元素,开始一个新的段落if ( xmlReader.Name == "category" )temp.Append("<p>");
file://添加元素名到输出中temp.Append( xmlReader.Name + ": " );}}
// 处理文本节点
else if (xmlReader.NodeType == XmlNodeType.Text) 
temp.Append(xmlReader.Value + "<br>");
file://处理元素节点的结尾else if (xmlReader.NodeType == XmlNodeType.EndElement) {
file://如果是<email>节点,添加结束段落的标记if ( xmlReader.Name == "email" ) temp.Append("</p>"); } }
//结束while循环
return temp.ToString();
} file://结束ProcessXML方法
} file://结束XmlDisplay类
private void Page_Load(Object sender, EventArgs e){
file://创建XmlDisplay类的实例XmlDisplay XmlDisplayDemo = new XmlDisplay();
output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}</script><html><head></head><body><h2>演示XmlTextReader类</h2>
<div id="output" runat="server"/></body></html>

 

 

 1    static void Main(string[] args)
 2        {
 3            DateTime d1 =DateTime.Now;
 4            XmlDocumentTest();
 5            DateTime d2 =DateTime.Now;
 6            TimeSpan ts =d2-d1 ;
 7            
 8            Console.WriteLine(ts.TotalMilliseconds) ;    
 9            Console.Read() ;
10
11        }
12
13
14        public static string XmlFileName = "../../XML/1.xml";
15        
16        private static void XmlTextReaderTest()
17        {
18            XmlTextReader reader = new XmlTextReader(XmlFileName);
19            while (reader.Read() )
20            {
21                bool exit =false;
22                switch(reader.NodeType)
23                {
24                    case XmlNodeType.Element :
25                        break;
26                    case XmlNodeType.Text :
27                        if (reader.Value=="last")
28                        {
29                            exit=true;
30                        }
31                        break;
32                    case XmlNodeType.EndElement  :
33                        break;
34                    default:
35                        break;
36                }
37                if(exit)
38                {
39                    return;
40                    
41                }
42
43            }
44        }
45
46        private static void XmlDocumentTest()
47        {
48            XmlDocument xd =new XmlDocument() ;
49            xd.Load(XmlFileName) ;
50            XmlNode node = xd.SelectSingleNode("/people/person[category='last']"); 
51            Console.Write(node.Name) ; 
52        }

以上就是XMLTextReader和XmlDocument读取XML文件的比较的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Pour toute traversée XMLArticle suivant:Pour toute traversée XML