소프트웨어/C# & ASP.NET

DataSet 을 이용한 XML 다루기

falconer 2009. 8. 11. 17:08

들어가면서...

C#에서 XML을 다루는 방법을 알아볼 예정이다. 뜬금없는 웬 XML 타령이냐고 따지고 들지 모르니, XML이 어떤 것이고 XML을 어떤 경우에 사용하는지 간단하게 알아보도록 하자. XML은 eXtensible Markup Language 의 약자이다. 단어의 뜻만 보자면 확장 가능한 데이터 기술 언어라는 것이다. 뭔소린지 아직 도통 글을 쓰는 필자도 감이 안온다. 그럼 XML을 정의하는 표준 문서를 열어보자. http://www.w3.org/XML/ 페이지를 열어보자..뜨앗..영어다 -_-; 그럼 소박하게 번역해보자. ISO 8879 국제표준 SGML에서 정의된 간단하고 아주 유연한 텍스트 형식이라고 한다. 그러니까 간단히 말하면 데이터 자체와 데이터의 포맷 형태를 동시에 공유할 수 있도록 해주는 차세대 정보 포맷이라는 말이다. 혹시 아직 말이 어렵다고 느끼는가? 그렇다면 간단하게 html에서 사용하는 tag와 같은 것을 사용자들이 정의하여서 그것들을 그룹화 해놓은 파일이라고 일단은 이해하고 넘어가도록 하자.

XML

XML은 단순하고 읽기 쉽고 표준이라는 3가지의 장점을 가진다. XML은 사용자들이 정의하는 데이터의 타입과 데이터의 값, 데이터의 표현을 가지기 때문에 단순하다는 장점을 가지며, 바이너리 형식이 아닌 텍스트형식의 포맷을 가지기 때문에 읽기 쉽다는 장점도 가지고 있지만, <nodedata>nodevalue</nodedata>와 같은 형식으로 데이터를 표현하기 때문에 데이터의 크기가 크고, 데이터가 크기 때문에 데이터의 전달이 오래 걸릴 수 있다는 단점 또한 같이 가진다. 여튼 XML은 표준이다. 표준으로서 가지는 장점은 다른 단점들을 모두 가릴 수는 없겠지만, 그래도 표준이기 때문에 많은 사람들이 지키고 그 사람들이 만드는 어플리케이션에서 사용할 것이다.

그럼 XML 이용형태에 대해서 3가지 정도를 알아보도록 하자. 먼저 웹 서비스의 데이터 전달이다. 웹 서비스에서 XML을 이용하여 데이터를 전달하는 부분은 나중에 웹 서비스에 대한 글을 적을 때 더 깊이 다루도록 하고 일단, 웹 서비스는 분산객체기술의 한 부분이라는 점만을 알고 넘어가자. 그리고 다음으로는 여러 가지 전자기기에서 사용이 된다. Home Auto 등으로 대변되는 우리의 미래 생활에서 동작되는 전자레인지와 같은 많은 전자제품들과의 데이터 통신에서도 사용할 수 있다. 마지막으로 간단한 DBMS와 같은 데이터 저장소로서의 역할이다.

자…이제 그럼 각설하고, C#에서 XML을 다루는 방법에 대해서 여러 가지를 알아볼 것인데, 오늘은 C#에서 XML을 가장 편하게 다룰 수 있는 방법인 DataSet을 통한 XML의 이용에 대해 알아보자.

DataSet을 이용한 XML 다루기

책상위의 몇 가지 객체에 관련한 데이터를 관리하는 XML을 하나 만들어 보도록 하자.

먼저 첫 Node는 펜이고, 가격은 200원이다.
다음 Node는 지우개이고, 가격은 300원이다.
XML 선언이 간단해 보이는가? 그게 XML의 최고의 장점이랜다..-_-;;;

위의 XML을 DataSet으로 가지고 오면 아래의 영역이 하나의 DataTable이 된다.

아래의 영역이 하나의 DataColumn이 된다.

아래의 영역이 하나의 DataRow가 된다.

VS2003에서 XML 파일을 열어보면 데이터셋과 유사하게 나오는 화면이 있어서 해당 부분이 XML을 DataSet으로 변환했을 때의 좋은 이미지인 것 같아 캡쳐해보았다.

자 그럼 이제 코드를 보도록 하자.

먼저 DataSet을 이용한 XML 다루기에서 키워드가 되는 2가지 함수는 ReadXml과 WriteXml이다.
ReadXml에 관련한 정보는
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadatasetclassreadxmltopic2.asp
에서 자세하게 찾아볼 수 있으며,
WriteXml에 관련한 정보는
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatadatasetclasswritexmltopic.asp
에서 찾아볼 수 있다.

XML을 DataSet으로 읽기

DataSet ds = new DataSet();
ds.ReadXml(XML파일경로);

DataSet을 XML로 저장하기

ds.WriteXml(xmlFilePath);

전체소스

test.xml

<?xml version="1.0" standalone="yes"?>
<items>
<item name="pen">
<cost>203</cost>
</item>
<item name="eraser">
<cost>300</cost>
</item>
</items>

program.cs

using System;
using System.Data;
namespace testApp
{
class Program
{
static void Main(string[] args)
{
DataSet ds = new DataSet();
ds.ReadXml("test.xml");
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
if (ds.Tables[0].Rows[i]["name"].ToString().Equals("pen"))
{
ds.Tables[0].Rows[i]["cost"]=int.Parse(ds.Tables[0].Rows[i]["cost"].ToString())+1;
}
ds.WriteXml("test.xml");
}
ds.Dispose();
}
}
}

헌데 이 간단한 방법은 너무나 많은 규칙을 요구한다.
아래와 같은 XML 파일이 있다고 가정해보자.

위의 XML 파일을 보면, 한 Node에서 Attribute Name과 해당 Node의 하위 Node의 Name이 동일하다.
위 상황은 DataSet으로 만들었을때 DataColumn의 Name이 충돌이 날 수 있기 때문에
실제로 동작을 시켜보면

위와 같은 에러를 뿜으며 장렬히 산화한다.

글을 마치며

DataSet을 이용한 XML을 다루는 것은 그 코드가 간단하고 사용방법이 쉽다는 장점이 있지만, 해당 XML 문서내의 데이터가 DataSet과 거의 똑같은 구조를 유지해야한다는 치명적인 단점이 있다. 하지만, 이러한 단점을 보유하고서라도 그 사용법이 간단하다는 점에서 테스트 또는 일부 서비스에서 사용하는 것에는 절대 무리가 없다고 생각한다.
오늘은 간단하게 DataSet을 이용해서 XML을 다루는 방법을 알아보았으며,
추후 XmlWriter, XmlReader, XmlDocument등 다른 여러가지 XML을 다루는 방법에 대해 알아볼 것을 약속하며 이만 글을 줄일까 한다.
------------------------------------------------------------------------------------------------------
출처 : http://www.hoons.kr/Lecture/LectureView.aspx?BoardIdx=231&kind=26 


 * 주인장의 덧붙이는 말

 DataSet을 이용해서 XML 파일을 만들때 각각의 애트리뷰트와 엘리먼트를 표현하고자 할때에는 DataColumn의 ColumnMapping 속성을 이용하여 DataColumn의 속성을 지정할수 있다.

           DataColumn j_journal_data_Id = new DataColumn("journal_data_Id");
            j_journal_data_Id.ColumnMapping = MappingType.Hidden;

위의 코드는 컬럼 타입을 Hidden으로 지정하여 XML로 Export 할때 표현되지 않도록 한것이다.
Hidden 속성 외에도 Attribute, Element, SimpleText의 속성이 있다.

또한, 각 노드간의 부모-자식 관계를 표현하려면 DataTable간의 Relation을 이용해 표현할 수 있으며 각 테이블간의 관계를 나타낼 수 있는 ID 컬럼을 만들어 관계를 설정하면 된다.

저작자 표시 비영리 변경 금지
출처 : http://dailykim.tistory.com/20