잊지 않겠습니다.

Pro LINQ (05)

Book 2009. 1. 9. 01:16
LINQ를 이용하면 XML의 검색 뿐 아니라, XML의 조작도 간단한 코드로 가능하다. 예전처럼 DataSet을 지정해서, DataSet에 Read Position을 잡아서 해주는 것이 아닌 직관적인 Method을 이용해서 XML의 조작이 가능하게 된다. 

기본적으로 사용되는 Method의 종류는 다음과 같다. 

추가 : Add(), AddFirst(), XNode.AddAfterSelft()
삭제 : Remove(), RemoveAll()
변경 : Update(), Replace(), ReplaceAll()

여기에서 재미있는 것이 ReplaceAll()의 경우인데, 모든 Element의 이름을 기준으로 값을 일괄적으로 변경이 가능하게 된다. 잘만 찾으면 재미있는 결과를 가지고 올 수 있을 것 같다. 

LINQ를 이용한 XML의 검색 및 변경에서 조금 특이한 경우가 XAttribute인데, XAttribute의 경우에는 W3C XML DOM API와 다르게 XAttribute를 통해서 이루어지게 된다. Element, Comment, Processing 과는 아주 약간 다른 조작을 행하게 되지만, 기본적으로 큰 차이는 존재하지 않는다. 

LINQ 및 기존의 XmlDocument에서 재미있는 내용중 하나는 각 Xml Element들에 대한 Event인데, XDocument에서도 기본적으로 Changing, Changed에 대해서 Event를 제공하고 있다. 

XDocument의 생성 및 변경을 통해서 재미있는 일을 할 수 있는데, 그 중 가장 재미있어보이기도 하고, 무엇보다 자주 사용할 수 있어보이는 XSLT transformation에 대한 재미있는 소스를 하나 적어보고 오늘 글을 마쳐볼려고 한다. ^^

XSLT :
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output method='html'/>
<xsl:template match='/'>
<html>
<head>
<title>Student Directory</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>

<xsl:template match='student_list'>
<h3>Student Directory for example.edu</h3>
<xsl:apply-templates />
</xsl:template>
<xsl:template match='name'>
<p>Name: <xsl:apply-templates /></p>
</xsl:template>
<xsl:template match='major'>
<p>Major: <xsl:apply-templates /></p>
</xsl:template>
<xsl:template match='phone'>
<p>Phone: <xsl:apply-templates /></p>
</xsl:template>
<xsl:template match='email'>
<p>Email: <xsl:apply-templates /></p>
</xsl:template>
</xsl:stylesheet>

XML : 
<student_list>
<student>
<name>John</name>
<major>Math</major>
<phone>010</phone>
<email>student1@mail.co.kr</email>
</student>
<student>
<name>Tom</name>
<major>English</major>
<phone>0001389</phone>
<email>student2@mail.co.kr</email>
</student>
</student_list>

이 둘에대한 transformation에 대한 소스는 다음과 같다. 
            XDocument xDocument = XDocument.Parse(xml);
            XDocument transformedDoc = new XDocument();
            using(XmlWriter xmlWriter = transformedDoc.CreateWriter())
            {
                XslCompiledTransform transform = new XslCompiledTransform();
                transform.Load(XmlReader.Create(new StringReader(xsl)));
                transform.Transform(xDocument.CreateReader(), xmlWriter);
            }
            Console.WriteLine(transformedDoc);


그리고 멋진 실행결과는 다음과 같다. ^^


이걸 이용하면 MailTemplate들이나 Table 표시 포멧을 만들어주는데 표준적인 방법을 제시할 수 있다. (당장 써보고 싶은 기능이다.)
Posted by Y2K
,