프로그래밍/Corona SDK2013. 8. 27. 13:07

* XML 파싱하기

 

 우선은 기본적으로 XML 파싱 스크립트가 만들어져 있는 게 있으므로 그것을 사용하는 것이 편하다. 다음 주소에서 xml.lua 파일을 다운받자. https://github.com/coronalabs/Corona-XML-Module


 대부분의 XML 파일을 다룰 때 가장 어려운 부분은 이 파일 안에 대부분 미리 만들어져 있으므로 문제가 없으나, 각자의 프로젝트에서 사용하기 위해서는 XML 데이터의 형식에 따라 좀 헷갈리는 부분이 있을 수도 있다.


 이 파일을 저장해둔 폴더와 같은 폴더에 main.lua 파일을 만든다.


local xml = require("xml").newParser()


local sprite = xml:loadFile( "xxx.xml" )

 --> sprite 변수는 xxx.xml 파일을 읽어오기 위한 변수이다


local spriteData = {} 


for i=1,#sprite.child do 

  --> sprite 변수를 사용해 읽은 내용을 spriteData에 순차적으로 집어넣는다(이 부분이 없으면 내용이 안들어감)

         spriteData[i] = sprite.child[i]

end


  이것으로 해당 xml 파일의 내용은 spriteData 테이블 안에 저장되었다. 


  다음은 원하는 트리부분을 읽어서 데이터값으로 가져와야 하는데, for문으로 루프를 돌려 가져온다.


<Project>


  <SpriteSheets>

    <SpriteSheet>

      <ID>1</ID>

      <FullPath>../test1.png</FullPath>

    </SpriteSheet>

    <SpriteSheet>

      <ID>2</ID>

      <FullPath>../test2.png</FullPath>

    </SpriteSheet>

  </SpriteSheets>


  <Sprites>

    <Sprite>

      <ConnectID>1</ConnectID>

      <ID>1</ID>

      <CutRectangle Left="11" Top="8" Width="91" Height="91" />

    </Sprite>

    <Sprite>

      <ConnectID>1</ConnectID>

      <ID>2</ID>

      <CutRectangle Left="119" Top="12" Width="76" Height="82" />

    </Sprite>

    <Sprite>

      <ConnectID>1</ConnectID>

      <ID>3</ID>

      <CutRectangle Left="215" Top="12" Width="97" Height="30" />

    </Sprite>

  </Sprites>


</Project>


 위와 같은 XML 데이터가 있을 경우 우선 가장 상위의 <Project>는 무시한다. 그 아래에 있는 <SpriteSheets>가 spriteData 테이블의 1번데이터가 된다. 즉 spriteData[1]이 된다. 


 또한 그 아래에 있는 <SpriteSheet>는 spriteData 테이블의 자식(child)이 된다. 즉 spriteData[1].child[1]이 된다.


 마찬가지로 그 아래에 있는 <ID>와 <FullPath>는 spriteData 테이블의 자식의 자식이 되므로, 각각 spriteData[1].child[1].child[1]spriteData[1].child[1].child[2]가 된다. 


 위 XML 데이터에서 <SpriteSheets>는 리소스 이미지 정보를, <Sprites>는 이미지로부터 잘라온 조각그림을 지정하는 데이터이며, 자식 데이터의 구조도 다르므로, 각각 다르게 읽을 필요가 있다. 


for i=1,#spriteData[1].child do

 for i2=1, #spriteData[1].child[i].child do

  print(spriteData[1].child[i].child[i2].value)

 end

end


 <SpriteSheets>             ---> spriteData[i]

   <SpriteSheet>             ---> spriteData[i].child[i]

     <ID>                            ---> spriteData[i].child[i].child[1].value  

(여기엔 값이 있고, 우리가 이 값을 사용하므로 .value를 붙여 값을 읽어온다)

     <FullPath>                 ---> spriteData[i].child[i].child[2].value


for i=1,#spriteData[2].child do


 print(spriteData[2].child[i].child[1].value)

 print(spriteData[2].child[i].child[2].value)


 local moduleX = (spriteData[2].child[i].child[3].properties["Left"])

 local moduleY = (spriteData[2].child[i].child[3].properties["Top"])

 local moduleX2 = (spriteData[2].child[i].child[3].properties["Width"])

 local moduleY2 = (spriteData[2].child[i].child[3].properties["Height"])

 

 print(moduleX, moduleY, moduleX2, moduleY2)


end


 기본적 구조는 위의 <SpriteSheets>를 읽어올 때와 같지만, <CutRectangle>에는 아래와 같이 값이 여러개 들어있다. 


<CutRectangle Left="11" Top="8" Width="91" Height="91" />


 요것은 .value 대신 .properties를 사용해 값을 읽어오게 된다. 어떤 값을 읽어올 것이냐에 따라 .properties["이름"]과 같이 사용한다.


Posted by windship