* 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["이름"]과 같이 사용한다.
'프로그래밍 > Corona SDK' 카테고리의 다른 글
코로나 SDK - 테이블 #2 (번역글) (0) | 2013.08.28 |
---|---|
코로나 SDK - 테이블 (0) | 2013.08.27 |
코로나 SDK - 비균일 스프라이트 (0) | 2013.08.27 |
코로나 SDK - 기본적인 그림출력, 균일 스프라이트 (0) | 2013.08.27 |
코로나 SDK - 기본 (0) | 2013.08.27 |