Trang :: XML로 XSD 작성해 주는 도구
XML을 바탕으로 XML 스키마를 생성해주는 도구입니다. 이상한 소리 아닌가요? XML을 XSD를 가지고 작성하는 건데 이건 반대입니다. TDD와 유사합니다. 테스트 케이스를 먼저 작성하고 원래 코드를 작성하는 것 처럼, XML 스키마 정의(XSD)를 작성하기 전에, 먼저 그 스키마를 사용한 XML부터 작성한 다음 그것을 바탕으로 XSD를 생성해 줍니다. 물론 원하는 스키마를 그대로 만들어주진 않기 때문에, 자동 생성된 스키마를 가지고 수정을 해서 사용하면 될 듯 합니다.
1. 사용하고 싶은 XML 작성하기.
2. Trang으로 XSD 생성하기.
3. XSD 수정하기.
이런 과정으로 XML 스키마를 생성하면, 좀 더 쉽고 빠르게 XSD를 작성할 수 있습니다.
http://thaiopensource.com/relaxng/trang.html 여기서 Trang을 다운 받으실 수 있습니다.
2003년 6월 19일에 배포한 파일이 마지막인 것 같습니다.
1. 사용하고 싶은 XML 작성하기.
xmlns="http://www.springinaction.com/poker/schemas">
<card>
<suit>HEARTS</suit>
<face>TEN</face>
</card>
<card>
<suit>SPADES</suit>
<face>KING</face>
</card>
<card>
<suit>HEARTS</suit>
<face>KING</face>
</card>
<card>
<suit>DIAMONDS</suit>
<face>TEN</face>
</card>
<card>
<suit>CLUBS</suit>
<face>TEN</face>
</card>
</EvaluateHandRequest>
위와 같은 XML을 사용하고 싶다고 가정하겠습니다. 위의 XML은 SIA 9장에 있는 것을 참조했습니다.
2. 위 XML이 유효하도록 하는 XSD를 만들어보겠습니다.
Trang을 다운로드 하고, 압축을 푼 뒤 다음과 같은 명령을 실행합니다.
java -jar trang.jar cards.xml poker.xsd
trang.jar는 실행가능한 압축파일입니다. 이 파일을 가지고 card.xml을 바탕으로 poker.xsd라는 파일을 만들게 됩니다.
3. 생성된 xsd 파일은 다음과 같습니다.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.springinaction.com/poker/schemas" xmlns:schemas="http://www.springinaction.com/poker/schemas">
<xs:element name="EvaluateHandRequest">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="schemas:card"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="card">
<xs:complexType>
<xs:sequence>
<xs:element ref="schemas:suit"/>
<xs:element ref="schemas:face"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="suit" type="xs:NCName"/>
<xs:element name="face" type="xs:NCName"/>
</xs:schema>
자 여기서 suit와 face의 타입을 ENUM 처럼 사용하기 위해 다음과 같이 변경해야겠습니다. 그리고 card가 무한대로 포함될 수 있도록 정의되어 있는데, 이 부분도 딱 다섯 장을 포함하도록 변경이 필요합니다.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.springinaction.com/poker/schemas"
xmlns:schemas="http://www.springinaction.com/poker/schemas">
<xs:element name="EvaluateHandRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="5" maxOccurs="5" ref="schemas:card" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="card">
<xs:complexType>
<xs:sequence>
<xs:element ref="schemas:suit" />
<xs:element ref="schemas:face" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="suit" type="schemas:Suit" />
<xs:simpleType name="Suit">
<xsd:restriction base="xs:string">
<xsd:enumeration value="SPADES" />
<xsd:enumeration value="CLUBS" />
<xsd:enumeration value="HEARTS" />
<xsd:enumeration value="DIAMONDS" />
</xsd:restriction>
</xs:simpleType>
<xs:element name="face" type="schemas:Face" />
<xs:simpleType name="Face">
<xsd:restriction base="xs:string">
<xsd:enumeration value="ACE" />
<xsd:enumeration value="TWO" />
<xsd:enumeration value="THREE" />
<xsd:enumeration value="FOUR" />
<xsd:enumeration value="FIVE" />
<xsd:enumeration value="SIX" />
<xsd:enumeration value="SEVEN" />
<xsd:enumeration value="EIGHT" />
<xsd:enumeration value="NINE" />
<xsd:enumeration value="TEN" />
<xsd:enumeration value="JACK" />
<xsd:enumeration value="QUEEN" />
<xsd:enumeration value="KING" />
</xsd:restriction>
</xs:simpleType>
</xs:schema>
이런식으로 xsd를 작성한다면, 조금은 쉽게 작성할 수 있을 것입니다.