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 작성하기.

<EvaluateHandRequest
    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 파일은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<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가 무한대로 포함될 수 있도록 정의되어 있는데, 이 부분도 딱 다섯 장을 포함하도록 변경이 필요합니다.

<?xml version="1.0" encoding="UTF-8"?>
<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를 작성한다면, 조금은 쉽게 작성할 수 있을 것입니다.