인터넷에서 기사를 보고 직접 시도해 보았습니다. 물론 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------빠른 단방향 버퍼링되지 않은 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:datasales.XML")은
Read() 메서드라는 루프를 생성합니다. 이 메서드의 반환 값은 반환 값이 false가 되는 경우 파일의 맨 아래에 도달할 때까지 항상 true입니다. . 즉, 루프는 파일의 시작 부분에서 시작하여 파일 끝에 도달할 때까지 한 번에 하나씩 모든 노드를 읽습니다.
While (myReader.Read()) {
...
// 여기에서 각 노드를 처리합니다.
...
}
Read()를 성공적으로 호출한 후 XMLTextReader 인스턴스화 프로그램에는 현재 노드(즉, 파일에서 방금 읽은 노드)에 대한 정보가 포함됩니다. 표 1에 설명된 대로 XMLTextReader의 멤버로부터 위의 정보를 얻을 수 있으며 NodeType 속성을 통해 현재 노드의 유형을 결정할 수 있습니다. 프로그램 코드는 노드 유형에 따라 노드 데이터를 읽고 속성이 있는지 여부를 확인하며 이를 무시할지 또는 프로그램의 필요에 따라 해당 작업 및 처리를 수행할지 여부를 확인할 수 있습니다.
NodeType 특성을 사용할 때 노드가 XML 셀과 어떻게 관련되어 있는지 이해하는 것이 중요합니다. 예를 들어 다음 XML 요소를 살펴보세요.
<city>Chongqing</city>
XMLtextReader는 이 요소를 다음 순서대로 3개의 노드로 간주합니다
. <city> 태그는 XMLNodeType.Element 유형의 노드로 읽혀지며 "city" 요소의 이름은 XMLTextReader의 Name 속성에서 얻을 수 있습니다.
2. 텍스트 데이터 "Chongqing"은 XMLNodeType.Text 유형의 노드로 읽혀집니다. "Chongqing" 데이터는 XMLTextReader의 Value 속성에서 얻을 수 있습니다.
3. </city> 태그는 XMLNodeType.EndElement 유형의 노드로 읽혀집니다. 마찬가지로 "city" 요소의 이름은 XMLTextReader의 Name 속성에서 사용할 수 있습니다.
이는 세 가지 중요한 노드 유형입니다. 다른 유형은 .NET 설명서에 자세히 설명되어 있습니다.
XMLTextReader에서 XML 구문 위반과 같은 오류가 발생하면 System.XML.XMLException 유형의 예외가 발생합니다. 나중에 데모 프로그램에서 볼 수 있듯이 이 클래스를 사용하는 코드는 항상 Try...Catch 블록에서 보호되어야 합니다.
이 기사는 XMLTextReader 클래스에 대한 매우 간단한 소개일 뿐입니다. XMLTextReader 클래스에는 꽤 많은 멤버가 있으므로 여기서 모두 언급하는 것은 불가능합니다. XMLTextReader는 XML 데이터를 읽을 때 상당한 유연성을 제공합니다. 그럼에도 불구하고 나는 독자들이 현실 세계에서 자주 요구되는 작업, 즉 XML 파일에서 데이터를 읽은 다음 HTML 형식으로 출력하여 브라우저에서 구현하는 작업을 달성하기 위해 프로그램을 작성할 수 있도록 많은 논의를 했습니다. 표시하다.
이 ASP.NET 프로그램(스크립트)은 서버에서 실행되며 브라우저에 다시 HTML 페이지를 생성합니다. 스크립트는 Snippet 1에 제공되며, 스크립트와 함께 작동하는 XML 데이터 파일은 Snippet 2에 제공됩니다. 이 XML 파일에는 관계 목록이 포함되어 있음을 알 수 있습니다. 프로그램의 목표는 우리가 쉽게 볼 수 있도록 형식이 지정된 이 목록을 표시하는 것입니다.
프로그램을 실행합니다:
1. 코드 조각 1을 XMLTextReader.ASPx 파일로 저장하고 코드 조각 2를 XMLData.XML 파일로 저장합니다.
2. .NET Framework가 설치된 웹 서버의 가상 폴더에 두 파일을 모두 저장합니다.
3. Internet Explorer를 열고 ASPx 파일을 찾습니다. 예를 들어 LAN 서버에서 URL은 http://localhost/xmltextreader.ASPx ;입니다.
프로그램 작업의 대부분은 XMLDisplay 클래스, 특히 ProcessXML() 메서드에 의해 수행됩니다. 한 번에 하나의 노드 XML 데이터를 읽습니다. 관심 있는 요소의 경우 노드 데이터와 콜론이 뒤따르는 노드 이름이 해당 HTML 형식 태그와 함께 출력 결과에 기록됩니다. 이 단계에서 "출력 결과"는 HTML 텍스트가 임시로 저장되는 StringBuilder 개체로 구성됩니다.
ProcessXML() 메서드는 LoadDocument() 메서드에서 호출됩니다. 이 메서드가 수행하는 작업은 XMLTextReader 인스턴스화 프로그램을 생성하고 ProcessXML을 호출하기 전에 XML 파일을 로드하는 것입니다. 또한 예외를 처리하고 이후에 오류 메시지를 생성하여 브라우저에 표시합니다. 궁극적으로 이 메서드는 생성된 HTML 콘텐츠가 포함된 문자열을 반환하거나 예외가 발생한 경우 오류 메시지를 반환합니다.
프로그램 실행은 Page_Load() 프로그램으로 시작됩니다. 브라우저가 이 페이지 탐색을 요청하면 이 단계가 자동으로 실행됩니다. 여기의 코드는 XMLDisplay 클래스를 인스턴스화하고 해당 LoadDocument() 메서드를 호출합니다. 모든 것이 정상적으로 실행되면 형식이 지정된 HTML 반환 값이 페이지의 <div> 태그에 복사되고 생성된 HTML 문서가 브라우저로 다시 전송되어 표시됩니다.
XMLDocument 클래스와 같은 다른 .NET Framework 클래스는 XML 데이터 읽기 작업을 어떻게 수행합니까? XMLDocument 클래스는 메모리에 전체 XML 문서의 노드 트리를 생성한다는 점에서 XMLTextReader 클래스와 다릅니다. 이러한 방식으로 XML 데이터는 무작위로 얻을 수 있으며(XMLTextReader 클래스가 데이터를 얻는 선형 방식과 정반대) XML 파일의 데이터와 구조를 수정할 때 완벽한 유연성을 갖습니다. 또한 XMLDocument를 사용하면 XSLT 변환을 수행할 수 있지만 이러한 추가 기능을 사용하면 실행 속도가 느려지고 시스템 리소스를 더 많이 사용하게 됩니다.
코드 조각 1: XmlTextReader.aspx
<%@ Import Namespace="System.Xml" %>
<script 언어="C#" runat=server>
공용 클래스 XmlDisplay
file://이 클래스는 XML 파일을 읽고 처리합니다.
{
공개 문자열 LoadDocument(String XmlFileName) {
XmlTextReader xmlReader = null;
StringBuilder html = 새로운 StringBuilder();
노력하다 {
file://은 XMLTextReader의 인스턴스를 생성합니다.
xmlReader = new XmlTextReader(XmlFileName);
// XML 파일 처리
html.Append(ProcessXml(xmlReader));
}
catch(XmlException ex){
html.Append("XML 예외가 발생했습니다: " +
ex.ToString());
}
잡기 (예외예외){
html.Append("일반적인 예외가 발생했습니다: " +
ex.ToString());
}
마지막으로
{
if (xmlReader != null)
xmlReader.Close();
}
html.ToString()을 반환합니다.
}
개인 문자열 ProcessXml(XmlTextReader xmlReader)
{
StringBuilder temp = new StringBuilder();
file://이 메서드는 XML 파일을 읽고 출력 HTML 문서를 생성합니다.
동안(xmlReader.Read())
{
// 요소 노드의 시작을 처리합니다.
if(xmlReader.NodeType == XmlNodeType.Element)
{
file://은 <people> 및 <person> 요소를 무시합니다.
if ((xmlReader.Name != "사람") && (xmlReader.Name != "사람"))
{
file://<category> 요소인 경우 새 단락을 시작합니다.
if (xmlReader.Name == "category" )
temp.Append("<p>");
file://출력에 요소 이름을 추가합니다.
temp.Append( xmlReader.Name + ": " );
}
}
// 텍스트 노드 처리
그렇지 않은 경우(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://End ProcessXML 메서드
} file://End XmlDisplay class
private void Page_Load(Object sender, EventArgs e){
file://XmlDisplay 클래스의 인스턴스 생성
XmlDisplay XmlDisplayDemo = new XmlDisplay();
output.InnerHtml = XmlDisplayDemo.LoadDocument(Server.MapPath("XMLData.xml"));
}
</스크립트>
<html>
<머리>
</머리>
<본문>
<h2>데모 XmlTextReader 클래스</h2>
<div id="출력" runat="서버"/>
</본문>
</html>
1개의 정적 무효 Main(string[] args)
2 {
3 날짜시간 d1 =날짜시간.지금;
4 XmlDocumentTest();
5 날짜시간 d2 =날짜시간.지금;
6 시간 범위 ts =d2-d1;
7
8 Console.WriteLine(ts.TotalMilliseconds);
9 콘솔.읽기();
10
11 }
12
13
14 공개 정적 문자열 XmlFileName = "../../XML/1.xml";
15
16 개인 정적 무효 XmlTextReaderTest()
17 {
18 XmlTextReader 리더 = new XmlTextReader(XmlFileName);
19 while (reader.Read() )
20 {
21 bool 종료 =false;
22 스위치(reader.NodeType)
스물셋 {
24개 사례 XmlNodeType.Element:
25 휴식;
26개 사례 XmlNodeType.Text:
27 if (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 =new XmlDocument();
49 xd.Load(Xml파일이름);
50 XmlNode 노드 = xd.SelectSingleNode("/people/person[category='last']");
51 Console.Write(노드.이름);
52 }
첫 번째 작업에는 시간이 오래 걸리는 것으로 나타났습니다.
두 번째 것은 시간이 많이 걸리는 것으로 나타났습니다.
http://www.cnblogs.com/goody9807/archive/2006/10/24/534888.html