'LINQ'에 해당되는 글 3건
- 2008/09/10 Silverlight에서 XML을 읽는 두 가지 간단한 방법
- 2008/07/24 Namespace와 LINQ to XML
- 2008/02/26 훈스닷넷 8회 닷넷 정기세미나 소식입니다. (1)
개요
네이버 실버라이트 카페의 어느 회원분이 질문을 올리셨기에 한번 정리해 보았습니다.
이 포스트에서는 XML이 존재하는 경로에 따라 대응하는 두 가지 방법을 소개하겠습니다.
이 두 가지 방법이면 왠만한 상황에는 다 대체가 되실 것으로 생각합니다.
(Cross Domain 정책에 의해 Blocking 되어있는 경우 제외. ^^;;)
Case 1. xap파일에 포함시켜 배포하는 xml 파일을 읽는 경우 (xml 파일의 속성이 Content 등.)
XDocument.Load(...)를 적극 활용합니다.
Case 2. 외부에 존재하는 xml 파일을 읽는 경우
WebClient.DownloadStringAsync를 통해 xml파일의 내용을 string으로 받아온 후,
XDocument.Parse(...)를 적극 활용합니다.
샘플 프로젝트(Source)
위 샘플 프로젝트를 다운 받아 열어보시면 아래와 같은 솔루션 트리를 보실 수 있습니다.
테두리가 쳐져 있는 주요 파일을 설명드리면,
1. System.Xml.Linq는 LINQtoXML사용을 위해서 필요한 어셈블리로서 'Add Reference'를 통해
수동으로 추가시켜 주셔야 합니다.
LINQtoXML을 사용하기 위해서 System.Linq와 System.Xml.Linq
두가지 namespace가 모두 추가되어야 합니다.
2. Inner.xml은 xap 패키지에 포함이 되어 배포가 되며, 속성은 Content(내용)입니다.
Inner.xml
<?xml version="1.0" encoding="utf-8" ?>
<Items>
<Item>Desk</Item>
<Item>TV</Item>
<Item>Table</Item>
<Item>Kitchen</Item>
<Item>Room</Item>
</Items>
<?xml version="1.0" encoding="utf-8" ?>
<Items>
<Item>Desk</Item>
<Item>TV</Item>
<Item>Table</Item>
<Item>Kitchen</Item>
<Item>Room</Item>
</Items>
3. Outer.xml은 외부에 존재하는 임의의 xml 파일을 대표합니다.
Open API 등을 통해 얻어온 XML 데이터라고 가정하고 이해하시면 되겠습니다.
Outer.xml
<?xml version="1.0" encoding="utf-8" ?>
<Items>
<Item>Car</Item>
<Item>Road</Item>
<Item>Tree</Item>
<Item>Park</Item>
<Item>Mountain</Item>
</Items>
<?xml version="1.0" encoding="utf-8" ?>
<Items>
<Item>Car</Item>
<Item>Road</Item>
<Item>Tree</Item>
<Item>Park</Item>
<Item>Mountain</Item>
</Items>
실행결과
보시는 바와 같이 두가지 파일을 모두 성공적으로 읽어서 Item의 Value만을 LINQ로 추출해 내었습니다.
워낙 간단한 소스라서 코드 설명은 생략합니다. 코드는 샘플 프로젝트를 참고하시기 바랍니다.
감사합니다.
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ButtonStyleSample.App"
xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
>
<vsm:Application.Resources>
<Style x:Key="myButtonStyle" TargetType="Button">
...생략
</Style>
<Style x:Key="yourButtonStyle" TargetType="Button">
...생략
</Style>
<Style x:Key="herButtonStyle" TargetType="Button">
...생략
</Style>
<Style x:Key="hisButtonStyle" TargetType="Button">
...생략
</Style>
</vsm:Application.Resources>
</Application>
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ButtonStyleSample.App"
xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
>
<vsm:Application.Resources>
<Style x:Key="myButtonStyle" TargetType="Button">
...생략
</Style>
<Style x:Key="yourButtonStyle" TargetType="Button">
...생략
</Style>
<Style x:Key="herButtonStyle" TargetType="Button">
...생략
</Style>
<Style x:Key="hisButtonStyle" TargetType="Button">
...생략
</Style>
</vsm:Application.Resources>
</Application>
string xml에 위의 내용이 들어있다고 가정하고,
XDocument xDoc = XDocument.Parse(xml);
위와 같이 xDoc을 준비해 놓고,
XML데이터에서 Style을 돌면서 x:Key의 Value값만 쏙쏙 뽑아내는 LINQ구문을 작성한다면
어떻게 하시겠습니까?
오답
첨엔 막연히 이렇게 해봤습니다.
var result = from c in xDoc.Descendants("Style")
select (string)c.Attribute("x:Key").Value;
select (string)c.Attribute("x:Key").Value;
네, 에러가 납니다.
Attribute의 이름에는 콜론(:)을 추가할 수 없습니다.
Attribute메서드의 파라미터는 XName이구요.
XName을 생성할 때 콜론(:)이 들어간 문자열을 허용하지 않기 때문입니다.
정답
XNamespace x = "http://schemas.microsoft.com/winfx/2006/xaml";
var result = from c in xDoc.Descendants("Style")
select (string)c.Attribute(x + "Key").Value;
var result = from c in xDoc.Descendants("Style")
select (string)c.Attribute(x + "Key").Value;
XNamespace + string이 XName이 되도록 연산기호 +에 대해
오퍼레이트 오버라이딩이 잘 되어있더라구요.
x + "Key" 이런 식으로 사용하는 것은 썩 직관적이지 않아서 맘에 안드는데,
알고 나니까 잘 쓸 수는 있겠더라구요. ^^
하지만 역시 LINQ는 쓰면 쓸수록 편한 것 같습니다.
Enjoy your LINQ!
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

XMLSample.zip
이올린에 북마크하기
이올린에 추천하기



















Prev

Rss Feed