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'>