はじめに
法律文書を集めようとすると、初めに考えうるのはeGovの条文と思われる。
条文データはXMLで公開されており、構造化されているためである。
他方、例えば裁判所の判例データは、PDFで公開されており、テキスト化すると少々崩れる(大きくは崩れなかった)。
筆者にとっての一番の問題は「XMLとは何ぞ?」な状態なことである。
ここでは、eGovデータを活用するにあたって、調べたXMLの使い方を記載する。
XMLとは
2000年頃、JSONが流行る前に使われていたデータを表現する技術。仕様が巨大すぎてよくわらからぬ。が、プログラム(クラス)も生成することができる模様。
パーサは機能が多くなりがちであり、それゆえ脆弱性を産みやすい。今も生き延びている亜流にHTMLがある。
やったこと
やらないといけないことは、
- XSD(xml schema definition:XMLのスキーマ定義)からクラスを生成する
- XMLデータを読み込み、オブジェクト(インスタンス)を生成する
の二つである。
XSDは以下から取れる。
https://elaws.e-gov.go.jp/help/
ちなみにXML(データ自体)は以下から取れる。
https://elaws.e-gov.go.jp/download/
1. XSDからクラスの生成
Java 8のJDK付属xjcを用いる。Java 9以降では付いていないらしい。
$> xjc XMLSchemaForJapaneseLaw_v3.xsd
トラブルシューティング(というか応急処置)
なんかエラーが出たので、とりあえずメモっとく。
$> xjc XMLSchemaForJapaneseLaw_v3.xsd
スキーマの解析中...
スキーマのコンパイル中...
[ERROR] 同じ名前"generated.Sublist3Sentence"のクラス/インタフェースがすでに使用されています。この競合を解決するには、ク ラス・カスタマイズを使用してください。
行1761
[ERROR] (前述のエラーに関連して)別の"Sublist3Sentence"がここから生成されます。
行1766
[ERROR] 2つの宣言により、ObjectFactoryクラスで衝突が発生しました。
行1761
[ERROR] (前述のエラーに関連して)これは他方の宣言です。
行1766
コードの生成に失敗しました。
なんか競合したので該当行において以下の処置を実施した(正直わかっていません)。
<xs:element name="Sublist3" type="Sublist3Sentence"/>
<xs:complexType name="Sublist3Sentence">
<xs:sequence>
<!--xs:element ref="Sublist3Sentence"/--> ★この辺(コメントアウト)
<xs:element ref="Sublist3SentenceE"/>★この辺(追記)
</xs:sequence>
</xs:complexType>
<!--xs:element name="Sublist3Sentence"--> ★この辺(コメントアウト)
<xs:element name="Sublist3SentenceE">★この辺(追記)
<xs:complexType>
<xs:choice>
<xs:element maxOccurs="unbounded" ref="Sentence"/>
<xs:element maxOccurs="unbounded" ref="Column"/>
</xs:choice>
</xs:complexType>
</xs:element>
2. XMLデータを読み込み、オブジェクトを生成する
読み込めば、自由に編集できる。
読み込むだけなら以下でできるが、構造を考えてのプログラミングは複雑なコードになっていく。別記事で記載する予定。
File file = new File(fileName + ".xml");
JAXBContext context = JAXBContext.newInstance(Law.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Law law = (Law)unmarshaller.unmarshal(file);
付録
生成されたクラスはGitHubに置いています。