XMLからスキーマ生成

素のXMLファイルからxsdやDTDといったXMLスキーマを自動で生成するツールが欲しかったのでwebで調べてみた。
フリーで今でもメンテナンスされていそうなのはTrangというツールしか見つけられなかった。
日本語訳されたページ

使い方はシンプルで以下のようなコマンドを打つだけでスキーマを生成できる。

java -jar trang.jar sample.xml sample.dtd

オプションを指定しない場合は2つの引数の拡張子を見てファイルを判断するような事がマニュアルに書いてあった。
1つ目の引数がソースファイルで2つ目の引数が生成されるファイルになる。

sample.xml

<?xml version="1.0" encoding="UTF-8" ?>
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:jp:srch" xsi:schemaLocation="urn:yahoo:jp:srch http://search.yahooapis.jp/WebSearchService/V1/WebSearchResponse.xsd" totalResultsAvailable="5990815" totalResultsReturned="2" firstResultPosition="1">
  <Result>
    <Title>沖縄県</Title>
    <Summary>沖縄県のホームページです。 ... 文字を大きくするには ・沖縄の概況 ・沖縄県のシンボル ・広報・広聴 ...</Summary>
    <Url>http://www.pref.okinawa.jp/</Url>
    <ClickUrl>http://wrs.search.yahoo.co.jp/</ClickUrl> 
    <ModificationDate>1131634800</ModificationDate>
    <MimeType>text/html</MimeType>
    <Cache>
      <Url>http://wrs.search.yahoo.co.jp</Url>
      <Size>53600</Size>
    </Cache>
  </Result>
  <Result>
    <Title>沖縄観光:沖縄情報IMA</Title> 
    <Summary>沖縄観光や沖縄旅行の総合情報をお届け。沖縄のホテル、沖縄のビーチ、沖縄の食事のお薦めランク、沖縄の旅行記、沖縄情報掲示板など。沖縄に関するベースサイトに利用ください... 沖縄観光と沖縄旅行 沖縄情報IMA サイト内情報案内 Yahoo Google Goo Infoseek ...</Summary>
    <Url>http://www.okinawainfo.net/</Url>
    <ClickUrl>http://wrs.search.yahoo.co.jp/S=96857362/K=%E6%B2%96%E7%B8%84/v=2/XP=yws/SID=w/l=WS1/R=2/H=1/IPC=jp/SHE=0//SIG=11fb0tho4/EXP=1132136080/*-http%3A//www.okinawainfo.net/</ClickUrl>
    <ModificationDate>1131116400</ModificationDate>
    <MimeType>text/html</MimeType>
    <Cache>
      <Url>http://wrs.search.yahoo.co.jp</Url>
      <Size>24507</Size>
    </Cache>
  </Result>
</ResultSet>

sample.xsd(xml -> xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:yahoo:jp:srch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:yahoo:jp:srch">
  <xs:import namespace="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="xsi.xsd"/>
  <xs:element name="ResultSet">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="ns1:Result"/>
      </xs:sequence>
      <xs:attribute name="firstResultPosition" use="required" type="xs:integer"/>
      <xs:attribute name="totalResultsAvailable" use="required" type="xs:integer"/>
      <xs:attribute name="totalResultsReturned" use="required" type="xs:integer"/>
      <xs:attribute ref="xsi:schemaLocation" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Result">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="ns1:Title"/>
        <xs:element ref="ns1:Summary"/>
        <xs:element ref="ns1:Url"/>
        <xs:element ref="ns1:ClickUrl"/>
        <xs:element ref="ns1:ModificationDate"/>
        <xs:element ref="ns1:MimeType"/>
        <xs:element ref="ns1:Cache"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Title" type="xs:string"/>
  <xs:element name="Summary" type="xs:string"/>
  <xs:element name="ClickUrl" type="xs:anyURI"/>
  <xs:element name="ModificationDate" type="xs:integer"/>
  <xs:element name="MimeType" type="xs:string"/>
  <xs:element name="Cache">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="ns1:Url"/>
        <xs:element ref="ns1:Size"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Size" type="xs:integer"/>
  <xs:element name="Url" type="xs:anyURI"/>
</xs:schema>

sample.dtd(xml -> DTD)

<?xml encoding="UTF-8"?>

<!ELEMENT ns1:ResultSet (ns1:Result)+>
<!ATTLIST ns1:ResultSet
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'
  xmlns:xsi CDATA #FIXED 'http://www.w3.org/2001/XMLSchema-instance'
  firstResultPosition CDATA #REQUIRED
  totalResultsAvailable CDATA #REQUIRED
  totalResultsReturned CDATA #REQUIRED
  xsi:schemaLocation CDATA #REQUIRED>

<!ELEMENT ns1:Result (ns1:Title,ns1:Summary,ns1:Url,ns1:ClickUrl,
                      ns1:ModificationDate,ns1:MimeType,ns1:Cache)>
<!ATTLIST ns1:Result
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:Title (#PCDATA)>
<!ATTLIST ns1:Title
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:Summary (#PCDATA)>
<!ATTLIST ns1:Summary
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:ClickUrl (#PCDATA)>
<!ATTLIST ns1:ClickUrl
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:ModificationDate (#PCDATA)>
<!ATTLIST ns1:ModificationDate
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:MimeType (#PCDATA)>
<!ATTLIST ns1:MimeType
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:Cache (ns1:Url,ns1:Size)>
<!ATTLIST ns1:Cache
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:Size (#PCDATA)>
<!ATTLIST ns1:Size
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>

<!ELEMENT ns1:Url (#PCDATA)>
<!ATTLIST ns1:Url
  xmlns:ns1 CDATA #FIXED 'urn:yahoo:jp:srch'>