妥当性を検証する
以上で、妥当性検証の準備は整いました。NetBeansを使って他のプロジェクトも同時に開いている場合、主プロジェクトとして設定する必要があります。[実行]-[主プロジェクトとして設定]を開くと、プロジェクトタブで開いているプロジェクト名がすべて表示されます。ここではXMLSchemaSample1を選択すれば、主プロジェクトになります。
NetBeansで[実行]-[主プロジェクトを削除して構築]をクリックするとwarファイルが構築されデプロイされます。筆者のWindows環境では「C:\Users\tomoharu\Documents\NetBeansProjects\XMLSchemaSample1\dist\XMLSchemaSample1.war」に配備されます。デフォルトでインストールした場合、Usersの次のフォルダが皆さんのフォルダ名に替わるだけです
次にNetBeansで[実行]-[主プロジェクト]を実行をクリックします。今回はWebアプリケーションとしてプロジェクトを構築しているためindex.jspが起動し、図2のような画面が表示されます。
特にXML文書、XMLスキーマ文書とも異常がない場合、図3のような画面が表示されます。
次にリスト5のように「杜氏潤平紅芋原酒」のABVを削除します(18行目と19行目の間のABVを削除します)。スキーマでABVはminOccursもmaxOccursも指定していないため、デフォルトで必須の要素とみなされます。またNAME、ABV、VOLUME、PRICEはこの順に並ばなければならないことをsequenceで指定しています。従って、妥当性検証の結果は図4のようになります。
001:<?xml version="1.0" encoding="UTF-8"?> 002:<MEIGARAS 003: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 004: xsi:noNamespaceSchemaLocation="sample1.xsd"> 005: <MEIGARA> 006: <NAME>がんご焼酎屋</NAME> 007: <ABV>25</ABV><!-- alcohol by volume(アルコール度数)の略 --> 008: <VOLUME>1800</VOLUME> 009: <PRICE>2630</PRICE> 010: </MEIGARA> 011: <MEIGARA> 012: <NAME>一壺春</NAME> 013: <ABV>25</ABV> 014: <VOLUME>720</VOLUME> 015: <PRICE>1360</PRICE> 016: </MEIGARA> 017: <MEIGARA> 018: <NAME>杜氏潤平紅芋原酒</NAME> 019: <VOLUME>500</VOLUME> 020: <PRICE>2050</PRICE> 021: </MEIGARA> 022:</MEIGARAS>
スキーマ文書自体の検証
先述の通り、JAXPでDocumentBuilderFactoryのsetAttributeメソッドを使用し、スキーマ文書を設定します。このスキーマ文書自体も、検証することが可能です。例えばリスト6のように、element要素の閉じカッコを記述しなかった場合(8行目の最後)、図5のようにエラーが発生します。W3C XML Schema自体を学習するにもありがたいツールです。
001:<?xml version="1.0" encoding="UTF-8"?> 002:<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 003: targetNamespace="http://kawakubo.jp/sample1"> 004: 005:<xs:element name="MEIGARAS"> 006: <xs:complexType> 007: <xs:sequence minOccurs="0" maxOccurs="unbounded"> 008: <xs:element name="MEIGARA" 009: <xs:complexType> 010: <xs:sequence> 011: <xs:element name="NAME" type="xs:string"/> 012: <xs:element name="ABV" type="xs:int"/> 013: <xs:element name="VOLUME" type="xs:int"/> 014: <xs:element name="PRICE" type="xs:int"/> 015: </xs:sequence> 016: </xs:complexType> 017: </xs:element> 018: </xs:sequence> 019: </xs:complexType> 020:</xs:element> 021: 022:</xs:schema>
ここでわざわざXMLスキーマ文書をいじくってエラーを出さなくとも、1からXMLスキーマ文書を作る時はエラーが発生します。その時このツールを使って、原因を突き止めるのに役立ててもらえればと思います(その場合、XML文書やXMLスキーマ文書を動的に選択できるように改良しなくてはなりません)。
おさらい
今回はW3C XML Schemaの入門の入門レベルですが、学んだことを整理します。
- XMLスキーマとはXML文書の文法書のようなもの。XMLスキーマの規則から外れたXML文書を見つけだすことができる。
- 「今からでも遅くない JAXPを学ぼう!(前編) XPathとXSLTを体験する」ではXMLからHTMLへの変換を説明しましたが、XSLT1.0はスキーマ対応していない。従って、変換元のXML文書が妥当な文書か検証したい場合、今回のようにJAXPに検証機能のAPIがあるため、それを利用し妥当性を検証できる。XSLTには検証に合格したものを渡すことができる。
- JAXPのAPIの検証ではXML文書だけでなくXMLスキーマ文書自体も検証することが可能である。
サンプルコード
今回のプロジェクトは取り立てて複雑でもありませんが、図6のようなフォルダ構成になっています。Meigara2.xmlやsample1.xsdファイルはここにはないので、管理しやすいフォルダに置いていただければと思います。その際にはMyXMLValidator.javaのSOURCE_PATHとXSD_PATHを変更し再ビルドして実行してください。
次回は、W3C XML Schemaをもう少し掘り下げて説明します。