[C# 강좌 25강] XML 통신 - Reader

공부/C#  2012.10.03 10:48



안녕하세요. 개발자 명월입니다.

이번 포스팅은 C#과 XML 통신에 대해 알아보겠습니다. 먼저 통신에 앞서 XML이 무엇인지 간략하게 알아보겠습니다.

XML(eXtensible Markup Languege)은 데이터 교환과 공유를 목적으로 1996년 W3C에서 정한 국제 표준안입니다. 그 당시 ISO에서 발표한 SGML 과 그 마크업을 바탕으로 웹기능을 특화시킨 HTML이 서서히 한계를 드러내자 W3C가 XML을 표준안으로 채택한 것입니다. XML 은 주로 다른 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복하기 위해 만들러 졌습니다.

XML의 구성요소는 구조(DTD와 스키마), 데이터(태그를 이용한 트리 형태로 표현),표현(XSL 이용 데이터 표현)으로 되어있습니다.

 

이번 포스팅은 XML에 대해 살펴보는 것이 아니라 XML 통신에 대한 포스팅이니 XML의 대한 자세한 설명은 MSDN링크를 걸어 놓겠습니다.

바로가기 - XML MSDN 바로가기

 

 

자 그럼 XML을 읽어드리기 위한 클래스에 대해서 알아보도록 하겠습니다.

C#에서는 보통 XMLTextReader 와 XmlNodeReader 두 클래스가 있으나 제가 사용하기에는 둘다 큰 차이는 없던걸로 기억합니다. 즉, 사용형식도 비슷하고 결과나 처리속도면도 거의 차이가 없습니다.

그럼 MSDN에서 두 클래스에 대해 찾아 보도록 하겠습니다.

 

바로가기 - XMLTextReader 바로가기

 

 

바로가기 - XmlNodeReader 바로가기

 

 

역시 설명보다는 하나의 예제로 설명하겠습니다.

(※ 예제는 블로그를 하시는 분이라면 각자 rss 가 있을 거라고 생각됩니다. rss는 XML형식으로 구성되어있으니 이 예제로 사용하시면 되고 없으신 분들은 제 피드 http://nowonbun.tistory.com/rss를 사용하시기 바랍니다.)

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Xml;
  5
  6 namespace Blog20121003
  7 {
  8     class Program
  9     {
10         static void Main(string[] args)
11         {
12             new Program();
13         }
14         public Program() {
15             int count_page = 0;
16             XmlTextReader xtr = new XmlTextReader("http://nowonbun.tistory.com/rss");
17             while (xtr.Read()) {
18                 if (count_page == 50) {
19                     Console.Write("More...");
20                     Console.ReadLine();
21                     count_page = 0;
22                 }
23                 for (int i = 0; i < xtr.Depth; i++) Console.Write(" ");
24                 switch (xtr.NodeType) {
25                     case XmlNodeType.Element:
26                         Console.Write("<" + xtr.Name);
27                         if (xtr.AttributeCount > 0) {
28                             for (int i = 0; i < xtr.AttributeCount; i++) {
29                                 xtr.MoveToAttribute(i);
30                                 Console.Write("{0}={1}", xtr.Name, xtr.Value);
31                             }
32                         }
33                         Console.Write(">");
34                         break;
35                     case XmlNodeType.Text:
36                         Console.WriteLine(xtr.Value);
37                         break;
38                     case XmlNodeType.EndElement:
39                         Console.WriteLine("</" + xtr.Name + ">");
40                         break;
41                 }
42                 count_page++;
43             }
44             xtr.Close();
45
46             Console.WriteLine("Press any key...");
47             Console.ReadLine();
48         }
49     }
50 }
51

 

 

 

XmlNodeReader는 아래와 같이 XmlDocument로 읽어 들여와서 XmlNodeReader 로 읽어 드리는 것 빼곤 사용하는 형식이 같습니다.

 

 

결과 화면입니다.

  

 

아래 코드는 유효성 검사식입니다. 유효성 검사식은 에러가 있는지 없는지 검사하는 식으로써 XML은 문서로 통신하는 방식 중에 하나 이므로 규격확인을 해야 잘못된 정보가 입력되지 않습니다.

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Xml;
  5
  6 namespace Blog20121003
  7 {
  8     class Program
  9     {
10         static void Main(string[] args)
11         {
12             new Program();
13         }
14         public Program() {
15             int count_page = 0;
16
17             XmlReaderSettings XRS = new XmlReaderSettings();
18             XRS.ValidationType = ValidationType.DTD;
19             XRS.ProhibitDtd = false;
20             XRS.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(XRS_ValidationEventHandler);
21             XmlReader xtr = XmlReader.Create("http://nowonbun.tistory.com/rss", XRS);
22             while (xtr.Read()) {
23                 if (count_page == 40) {
24                     Console.Write("More...");
25                     Console.ReadLine();
26                     count_page = 0;
27                 }
28                 for (int i = 0; i < xtr.Depth; i++) Console.Write(" ");
29                 switch (xtr.NodeType) {
30                     case XmlNodeType.Element:
31                         Console.Write("<" + xtr.Name);
32                         if (xtr.AttributeCount > 0) {
33                             for (int i = 0; i < xtr.AttributeCount; i++) {
34                                 xtr.MoveToAttribute(i);
35                                 Console.Write("{0}={1}", xtr.Name, xtr.Value);
36                             }
37                         }
38                         Console.Write(">");
39                         break;
40                     case XmlNodeType.Text:
41                         Console.WriteLine(xtr.Value);
42                         break;
43                     case XmlNodeType.EndElement:
44                         Console.WriteLine("</" + xtr.Name + ">");
45                         break;
46                 }
47                 count_page++;
48             }
49             xtr.Close();
50
51             Console.WriteLine("Press any key...");
52             Console.ReadLine();
53         }
54
55         void XRS_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
56         {
57             if (e.Exception != null) {
58                 Console.WriteLine("err:{0}, {1}-{2}",e.Exception.Message,e.Exception.LineNumber,e.Exception.LinePosition);
59             }
60             if (e.Severity == System.Xml.Schema.XmlSeverityType.Error) {
61                 Console.WriteLine("유효성 검증 에러!!!");
62             }
63             else if (e.Severity == System.Xml.Schema.XmlSeverityType.Warning) {
64                 Console.WriteLine("스키마가 존재하지 않음!!!");
65             }
66         }
67     }
68 }
69

 

 

 

결과 화면입니다.

 

 

(※ Tistory에서 제공하는 Rss는 에러가 없는 XML이라서 유효성 검사에 걸리지 않습니다.^^)

 

참고소스 : Blog20121003.zip

 


댓글 2개가 달렸습니다.
댓글쓰기
  1. XML통신
    2013.08.01 20:02 신고 |  수정/삭제  댓글쓰기

    네, 그럼 XML 파일을 읽어오고 화면에 뿌리는 소스는 이제 됐으니
    XML 통신 방법에 대해 설명을 해주세요.

    • 明月 v명월v
      2013.08.03 10:46 신고 |  수정/삭제

      안녕하세요.. 블로그 방문 감사합니다.
      하하 제가 설명이 부족했네요... XML 통신이라는데 XML문서로 통신하는 형식을 말합니다.. 즉.. XML에 값을 입력후에 FTP나 HTTP 등을 이용해서 문서를 전송을 하면 되겠습니다.