>  기사  >  백엔드 개발  >  XML 파일 읽기를 위한 XMLTextReader와 XmlDocument 비교

XML 파일 읽기를 위한 XMLTextReader와 XmlDocument 비교

黄舟
黄舟원래의
2017-02-28 16:29:561703검색

인터넷에서 기사를 보고 직접 시도해 보았는데 역시 xmlTextReader가 더 빠릅니다!

.NET Framework의 System.XML 네임스페이스에 포함된 XMLTextReader 클래스는 많은 시스템 리소스를 요구하지 않고도 XML 파일에서 데이터를 빠르게 읽을 수 있습니다. XMLTextReader 클래스를 사용하여 XML 파일에서 데이터를 읽고 브라우저에 출력할 수 있도록 HTML 형식으로 변환합니다.

이 기사를 읽기 전에 독자는 XML, HTML, C# 프로그래밍 언어와 같은 몇 가지 기본 지식과 .NET, 특히 asp.net 프레임워크에 대한 지식을 이해해야 합니다.

Microsoft의 .NET 프레임워크는 개발자에게 다양한 개발 편의성을 제공합니다. XML의 중요성이 계속해서 커짐에 따라 개발자는 강력한 XML 도구 전체 세트의 개발을 기대하고 있습니다. .NET 프레임워크는 우리의 기대에 부응하고 System.XML 네임스페이스에서 XML에 대해 다음 클래스를 구성했습니다.

XMLTextReader------버퍼되지 않은 방식으로 빠른 단방향 Access XML 데이터를 제공합니다. 방법. (단방향은 XML 파일을 앞에서 뒤로만 읽을 수 있고 역방향으로는 읽을 수 없음을 의미합니다.)

XMLValidatingReader------XMLTextReader 클래스와 함께 사용되며 DTD, XDR 및 XSD의 유효성 검사를 제공합니다. 스키마 능력.

XMLDocument------W3C 문서 개체 모델 사양의 기본 및 보조 표준을 따라 XML 데이터에 대한 무작위 및 캐시 액세스를 달성합니다. 첫 번째 수준에는 DOM의 가장 기본적인 부분이 포함되어 있고, 두 번째 수준에는 네임스페이스 및 계단식 다이어그램(CSS)에 대한 추가 지원을 포함하여 다양한 개선 사항이 추가되었습니다.

XMLTextWriter------W3C XML 1.0 사양을 준수하는 XML 파일을 생성합니다.

이 기사에서는 주로 첫 번째 클래스 XMLTextReader에 대해 설명합니다. 이 클래스의 목적은 높은 시스템 리소스(주로 메모리 및 프로세서 시간 요구 사항 포함)를 요구하지 않고 XML 파일에서 데이터를 빠르게 읽는 것입니다. 상위 프로그램의 제어 하에 한 번에 하나의 노드만 처리하여 XML 파일을 점진적으로 작동함으로써 이 작업 프로세스를 구현합니다. XML 파일의 각 노드에서 상위 프로그램은 노드 유형, 해당 속성 및 데이터(있는 경우), 노드에 대한 기타 정보를 확인할 수 있습니다. 이 정보를 기반으로 상위 프로그램은 다양한 애플리케이션 요청의 요구 사항을 충족하기 위해 이 노드를 처리할지 아니면 노드 정보를 무시할지 선택할 수 있습니다. 상위 프로그램이 요청을 하고 XML 파일에서 개별 노드를 추출한 다음 필요에 따라 이를 처리하거나 처리하지 않기 때문에 이를 풀 처리 모델이라고 합니다.
XMLTextReader 클래스를 프로그래머들 사이에서 매우 인기 있는 XML 데이터 읽기를 위한 또 다른 기술인 XML 단순 응용 프로그래밍 인터페이스(SAX)와 비교할 수 있습니다. XMLTextReader와 SAX는 많은 시스템 리소스를 차지하지 않고 XML 파일에서 데이터를 빠르게 읽을 수 있다는 점에서 매우 유사합니다. 그러나 XMLTextReader의 추출 모델과 달리 SAX는 푸시 모델을 사용합니다. XML 프로세서는 "이벤트"를 사용하여 호스트 애플리케이션에 어떤 노드 데이터가 사용 가능하고 어떤 데이터는 필요에 따라 얻을 수 없는지 알리고, 호스트 프로그램은 이에 따라 반응하거나 무시합니다. . 즉, 데이터가 SAX 핸들러에서 호스트로 푸시됩니다. 프로그래머들은 풀아웃 처리 모델과 푸시인 처리 모델 중 어느 쪽이 더 장점이 있는지 논쟁을 벌이게 되지만, 두 모델 모두 잘 작동한다는 점은 부인할 수 없습니다. .NET Framework는 SAX를 지원하지 않지만 MSXML 파서와 같은 기존 SAX 도구를 .NET 애플리케이션에서 사용할 수 있습니다.

XMLTextReader 클래스에는 기존 데이터 스트림이나 URL(Uniform Resource Locator)에서 데이터를 읽는 등 다양한 상황을 수용할 수 있는 생성자가 있습니다. 가장 일반적으로 파일에서 XML 데이터를 읽으려고 할 수 있으며 이를 제공하는 해당 생성자가 있습니다. 여기에 예가 있습니다. 모든 코드 예는 C#으로 되어 있으며 VISUAL BASIC을 사용하려는 경우 쉽게 변환할 수 있습니다.

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

Read() 메서드라는 루프를 만듭니다. 이 메서드의 반환 값은 반환 값이 false가 될 때 파일의 맨 아래에 도달할 때까지 항상 true입니다. 즉, 루프는 파일 시작 부분에서 시작하여 파일 끝에 도달할 때까지 한 번에 하나씩 모든 노드를 읽습니다.

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

Read()를 성공적으로 호출할 때마다 XMLTextReader 인스턴스화기 현재 노드(파일에서 방금 읽은 노드)에 대한 정보를 포함합니다. 표 1에 설명된 대로 XMLTextReader의 멤버로부터 위의 정보를 얻을 수 있으며 NodeType 속성을 통해 현재 노드의 유형을 결정할 수 있습니다. 프로그램 코드는 노드 유형에 따라 노드 데이터를 읽고 속성이 있는지 여부를 확인하며 이를 무시할지 또는 프로그램의 필요에 따라 해당 작업 및 처리를 수행할지 여부를 확인할 수 있습니다.

NodeType 속성을 사용할 때 노드가 XML 단위와 어떻게 관련되어 있는지 이해하는 것이 중요합니다. 예를 들어 다음 XML 요소를 살펴보세요.

<city>Chongqing</city>

XMLtextReader는 이 요소를 다음 순서대로 3개의 노드로 처리합니다.

1. 태그는 XMLNodeType.Element 유형의 노드로 읽혀지며 "city" 요소의 이름은 XMLTextReader의 Name 속성에서 얻을 수 있습니다.

  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)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.