RELAX NG コンパクト構文をお楽しみください
さまざまな XML スキーマ言語を試してみたところ、RELAX NG がほとんどの場合に最適であることがわかりました (理由は最後にあります)。
要件
- XML 文書構造の文書化を許可する
- 読みやすい形式で行う
- 作者にとってはシンプルに
修正サンプル XML (doc.xml)
ドキュメントでこのタイプの構造も説明するために、1 つの属性を追加しました。
<objectRoot created="2015-05-06T20:46:56+02:00">
<v>
<!-- Current version of the object from the repository. !-->
<!-- (Occurance: 1) -->
</v>
<label>
<!-- Name of the object from the repository. !-->
<!-- (Occurance: 0 or 1 or Many) -->
</label>
</objectRoot>
コメント付きの RELAX NG Compact 構文を使用する (schema.rnc)
RELAX NG では、サンプルの XML 構造を次のように記述できます。
start =
## Container for one object
element objectRoot {
## datetime of object creation
attribute created { xsd:dateTime },
## Current version of the object from the repository
## Occurrence 1 is assumed by default
element v {
text
},
## Name of the object from the repository
## Note: the occurrence is denoted by the "*" and means 0 or more
element label {
text
}*
}
一定の表現力を保ちながら、シンプルさを超えるのは非常に難しいと思います。
構造をコメントする方法
XML スキーマ 1.0 が必要な場合は、それを生成します (schema.xsd)
と呼ばれる (オープン ソースの) ツールがtrang
利用可能であると仮定すると、次のように XML スキーマ ファイルを作成できます。
$ trang schema.rnc schema.xsd
結果のスキーマは次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="objectRoot">
<xs:annotation>
<xs:documentation>Container for one object</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="v"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="label"/>
</xs:sequence>
<xs:attribute name="created" use="required" type="xs:dateTime">
<xs:annotation>
<xs:documentation>datetime of object creation</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="v" type="xs:string">
<xs:annotation>
<xs:documentation>Current version of the object from the repository
Occurance 1 is assumed by default</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="label" type="xs:string">
<xs:annotation>
<xs:documentation>Name of the object from the repository
Note: the occurance is denoted by the "*" and means 0 or more</xs:documentation>
</xs:annotation>
</xs:element>
</xs:schema>
これで、XML スキーマ 1.0 のみを使用することを主張するクライアントは、XML ドキュメント仕様を使用できるようになります。
schema.rnc に対する doc.xml の検証
jing
RELAX NG Compact 構文をサポートするオープン ソース ツールがありrnv
、Linux と MS Windows の両方で動作します。
注: これらのツールはかなり古いものですが、非常に安定しています。時代遅れの兆候としてではなく、安定の兆候として読んでください。
ジンを使用:
$ jing -c schema.rnc doc.xml
これ-c
は重要jing
です。デフォルトでは、XML 形式の RELAX NG を前提としています。
を使用rnv
して確認すると、schema.rnc
それ自体が有効です。
$ rnv -c schema.rnc
そして検証するdoc.xml
:
$ rnv schema.rnc doc.xml
rnv
一度に複数のドキュメントを検証できます:
$ rnv schema.rnc doc.xml otherdoc.xml anotherone.xml
RELAX NG コンパクトな構文 - 長所
- 非常に読みやすく、初心者でもテキストを理解する必要があります
- 習得が容易 (RELAX NG には優れたチュートリアルが付属しており、そのほとんどを 1 日で習得できます)
- 非常に柔軟です (実際にはシンプルに見えますが、多くの状況をカバーし、XML Schema 1.0 では解決できないものもあります)。
- 他のフォーマットに変換するためのいくつかのツール (RELAX NG XML フォーム、XML スキーマ 1.0、DTD、さらにはサンプル XML ドキュメントの生成) が存在します。
RELAX NG の制限事項
- 多重度は、「0 または 1」、「1 つだけ」、「0 以上」、または「1 つ以上」のいずれかです。(少数の要素の多重度は、「0 または 1」の定義の「愚かな繰り返し」によって記述できます)
- RELAX NG では記述できない XML スキーマ 1.0 構造があります。
結論
上で定義した要件には、RELAX NG Compact 構文が最適です。RELAX NG を使用すると、人間が読み取れるスキーマを取得でき、自動検証にも使用できます。
既存の制限が有効になることはあまりなく、多くの場合、コメントやその他の手段によって解決できます。