본문 바로가기

Silverlight

LINQ To Xml 사용할때 NameSpace 를 잊지 말고 사용해 주도록 합시다.


정말이지 가끔 까먹어서

한참을 헤매게 되는군요..

예를 들어 다음과 같은 구문이 있다 합시다.



<?xml version="1.0" encoding="utf-8"?>
<Collection MaxLevel="8" TileSize="256" Format="jpg" NextItemId="39" xmlns="http://schemas.microsoft.com/deepzoom/2008">
  <Items>
    <I Id="0" N="0" Source="http://localhost/000.jpg.xml">
      <Size Width="4128" Height="6189" />
      <Viewport Width="1" X="0" Y="0" />
    </I>
    <I Id="1" N="1" Source="http://localhost/001.jpg.xml">
      <Size Width="4128" Height="6189" />
      <Viewport Width="1" X="0" Y="0" />
    </I>
    <I Id="2" N="2" Source="http://localhost/002.jpg.xml">
      <Size Width="4128" Height="6189" />
      <Viewport Width="1" X="0" Y="0" />
    </I>
  </Items>
</Collection>




여기서 Source 에 해당하는 부분만을 뽑고 싶을때

만일 네임 스페이스가 없는 상태라면

다음과 같이 코드를 작성해 줍니다.

var Source = from I in xml.Elements("Items").Elements("I")
          select I.Attribute("Source");

하지만 실제 위의 경우에는 Collection 란에 xmlns 가 "http://schemas.microsoft.com/deepzoom/2008" 로 지정되어 있으므로

실제 프로그램을 돌려보면 Linq 는 에러도 내지 않고

그냥 해당되는 내용이 없는 상태로 출력되게 되지요.

네임스페이스가 있는 xml 을 Linq To Xml 에서 쿼리하는 방법은 간단한데

네임스페이스 변수를 선언하여 할당하고

엘리먼트란에 네임스페이스를 "+" 연산자로 연결시켜주면 되게 되죠.

다음과 같이 말입니다.



XNamespace xns = @"http://schemas.microsoft.com/deepzoom/2008";
var Source = from I in xml.Elements(xns + "Items").Elements(xns + "I")
          select I.Attribute("Source");



정말이지 가끔 헷갈리는군요...

(한번 까먹고 코딩하면 한두시간 헤매고요)

결정적으로 제가 만든 xml 들은 네임스페이스가 없어서 자꾸 까먹고 실수하는것 같아요..

이 참에 내가 만든 xml 에도 네임스페이스를 다 붙여버려 ???!!!!!

[출처] 이과장의 프로그래밍이야기