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"); |