💬0 📅 6월 19, 2022
XML이란 무엇인가? XML(eXtensible Markup Language)은 W3C에서 개발된, 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어이다. XML은 SGML의 단순화된 부분집합으로, 다른 많은 종류의 데이터를 기술하는 데 사용할 수 있다. XML은 주로 다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 …

XML이란 무엇인가?

XML(eXtensible Markup Language)은 W3C에서 개발된, 다른 특수한 목적을 갖는 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어이다. XML은 SGML의 단순화된 부분집합으로, 다른 많은 종류의 데이터를 기술하는 데 사용할 수 있다. XML은 주로 다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복할 목적으로 만들어졌다. (출처: 위키백과)

즉 인터넷에 연결되 시스템끼리 데이터를 쉽게 주고 받을 수 있는 데이터 형식이므로 C#에서도 Object로 받아 오거나, XML로 출력할 수 있습니다.


실습 XML 파일

아래 XML 코드는 마이크로소프트 docs 사이트 중에 하나를 가져온 것입니다.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
   </book>
   <book id="bk104">
      <author>Corets, Eva</author>
      <title>Oberon's Legacy</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-03-10</publish_date>
      <description>In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
   </book>
   <book id="bk105">
      <author>Corets, Eva</author>
      <title>The Sundered Grail</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-09-10</publish_date>
      <description>The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberon's Legacy.</description>
   </book>
   <book id="bk106">
      <author>Randall, Cynthia</author>
      <title>Lover Birds</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-09-02</publish_date>
      <description>When Carla meets Paul at an ornithology 
      conference, tempers fly as feathers get ruffled.</description>
   </book>
   <book id="bk107">
      <author>Thurman, Paula</author>
      <title>Splish Splash</title>
      <genre>Romance</genre>
      <price>4.95</price>
      <publish_date>2000-11-02</publish_date>
      <description>A deep sea diver finds true love twenty 
      thousand leagues beneath the sea.</description>
   </book>
   <book id="bk108">
      <author>Knorr, Stefan</author>
      <title>Creepy Crawlies</title>
      <genre>Horror</genre>
      <price>4.95</price>
      <publish_date>2000-12-06</publish_date>
      <description>An anthology of horror stories about roaches,
      centipedes, scorpions  and other insects.</description>
   </book>
   <book id="bk109">
      <author>Kress, Peter</author>
      <title>Paradox Lost</title>
      <genre>Science Fiction</genre>
      <price>6.95</price>
      <publish_date>2000-11-02</publish_date>
      <description>After an inadvertant trip through a Heisenberg
      Uncertainty Device, James Salway discovers the problems 
      of being quantum.</description>
   </book>
   <book id="bk110">
      <author>O'Brien, Tim</author>
      <title>Microsoft .NET: The Programming Bible</title>
      <genre>Computer</genre>
      <price>36.95</price>
      <publish_date>2000-12-09</publish_date>
      <description>Microsoft's .NET initiative is explored in 
      detail in this deep programmer's reference.</description>
   </book>
   <book id="bk111">
      <author>O'Brien, Tim</author>
      <title>MSXML3: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>36.95</price>
      <publish_date>2000-12-01</publish_date>
      <description>The Microsoft MSXML3 parser is covered in 
      detail, with attention to XML DOM interfaces, XSLT processing, 
      SAX and more.</description>
   </book>
   <book id="bk112">
      <author>Galos, Mike</author>
      <title>Visual Studio 7: A Comprehensive Guide</title>
      <genre>Computer</genre>
      <price>49.95</price>
      <publish_date>2001-04-16</publish_date>
      <description>Microsoft Visual Studio 7 is explored in depth,
      looking at how Visual Basic, Visual C++, C#, and ASP+ are 
      integrated into a comprehensive development 
      environment.</description>
   </book>
</catalog>


C# XML 파싱하기

아래의 코드는 XML파일을 XDocument 클래스를 이용하여 파싱하는 예제 입니다. books.xml이라는 파일을 읽고, XML의 Element들을 foreach 반복문을 통해 출력하며 하위 Element가 있는 경우 그 Element들을 출력합니다. 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 //using System.Xml.Linq;
XDocument xdoc = XDocument.Load(@"F:\books.xml");

IEnumerable<XElement> books = xdoc.Root.Elements();
foreach (var book in books)
{
    Console.WriteLine("-----------------------------------------------");
    Console.WriteLine("Parent Element  Name:" + book.Parent.Name);
    Console.WriteLine("Current Element Name:" + book.Name);
    Console.WriteLine("-----------------------------------------------");
    if (book.HasElements)
    {
        Console.WriteLine("-----------------------------------------------");
        foreach (var e in book.Elements())
        {
            Console.WriteLine(e.Name + " = " + e.Value);
        }
        Console.WriteLine("-----------------------------------------------");
    }
}

C# XML Object로 받아오기(Serialization)

우선 XML을 Object로 받아오기 위해는 XML에 맞는 클래스를 정의 해야 합니다. 아래와 같이 XML의 Root Element와 하위 XML Element에 대한 클래스를 정의 합니다. 하위 Element는 Root Element의 멤버 변수로 포함시키며, 이 때  List 자료구조를 이용하여 추가 합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//using System.Xml.Serialization;
[XmlRoot("catalog")]
public class BookList
{
    [XmlElement("book")]
    public List<Book> Books { get; set; }
}

public class Book
{
    [XmlElement("author")]
    public string author { get; set; }
    [XmlElement("title")]
    public string title { get; set; }
    [XmlElement("genre")]
    public string genre { get; set; }
    [XmlElement("price")]
    public string price { get; set; }
    [XmlElement("publish_date")]
    public string publish_date { get; set; }
    [XmlElement("description")]
    public string description { get; set; }

}

그리고  XmlSerializer를 이용하여 Books.xml에서 읽어온 텍스트를 바탕으로 Object로 변환합니다. 아래는 XML 문서를 Object로 변환하고 출력하능 예제입니다. 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
XmlSerializer serializer = new XmlSerializer(typeof(BookList));
string allText = File.ReadAllText(@"F:\books.xml");
using (TextReader reader = new StringReader(allText))
{
    BookList bookList = (BookList)serializer.Deserialize(reader);

    foreach (var book in bookList.Books)
    {
        Console.WriteLine(book.author);
        Console.WriteLine(book.title);
        Console.WriteLine(book.genre);
        Console.WriteLine(book.price);
        Console.WriteLine(book.publish_date);
    }
}

C# XML 문서로 출력하기

아래 예제는 XDocument 클래스를 이용하여 XML 형태로 파일 저장하는 예제 입니다. Root Element를 가장 먼저 선언한후에, 이 Root Element에 하위  Element들을 추가합니다. 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
XDocument fruitDoc   = new XDocument();
XElement  fruitRoot  = new XElement("FruitList");

XElement xe1 = new XElement("Fruit",
    new XAttribute("Id", "1"),
    new XElement("Name", "Apple"),
    new XElement("Price", "1000")
);

XElement xe2 = new XElement("Fruit",
    new XAttribute("Id", "2"),
    new XElement("Name", "Banana"),
    new XElement("Price", "2000")
);

fruitRoot.Add(xe1);
fruitRoot.Add(xe2);
fruitDoc.Add(fruitRoot);

fruitDoc.Save(@"F:\Fruit.xml");