XMLの基本 6章 エンティティ宣言
- 6.1 エンティティ
- 6.2 内部エンティティ
- 6.3 外部エンティティ
- 6.4 エンティティ宣言に関する注意
- 6.5 解析対象外エンティティとNOTATION宣言
- 6.6 パラメーターエンティティ
- 6.7 まとめ
- (参考1) standalone文書
- (参考2) 他のスキーマ言語
(参考2)他のスキーマ言語
本章でスキーマ言語DTDの解説が終了します。そこで、XMLの他のスキーマ言語について、記述します。
DTDはSGMLより、引き継いだスキーマ言語です。以下の問題があります。
- XMLの構文に対応していない。
- データ型の種類が貧弱
- 名前空間に対応していない。
そのため、新しいスキーマ言語の必要性が高まってきました。その中で、生まれてきたスキーマ言語がXML SchemaとRelaxです。
XML Schemaは、W3CがXMLでのすべてのニーズに対応する唯一のスキーマ言語として制定作業中のスキーマ言語です。W3Cにより制定作業中ですので、ある意味「正式」なXMLのスキーマ言語といえます。DTDの問題点をすべてカバーしている半面、仕様が複雑で、勧告も遅れています。
RELAXは、複雑、多機能化しXML Schemaに対抗して、DTDの問題点の改善といくつかの独自拡張を行って制定されたものです。実装が容易である反面、W3Cなどからの勧告を得ていません。
以下は、スキーマをDTD、XML Schema、Relaxで記述したものです。例をみただけで、XMLの構文に対応していることがわかると思います。また、zip要素や、orderDate属性でデータ型をより細かく指定しています。各スキーマ言語に関する構文の詳細な解説は省きます。例を以下に示します。
<?xml version="1.0"?> <purchaseOrder orderDate="1999-10-20"> <shipTo country="US"> <name>Alice Smith</name> <address>123 Maple Street,Mill Valley,CA </address> <zip>90952</zip> </shipTo> <billTo country="US"> <name>Robert; Smith</name> <address>8 Oak Avenue,Old Town,PA</address> <zip>95819</zip> </billTo> </purchaseOrder>
上のXML文書のスキーマを各スキーマ言語で記述します。
<!DOCTYPE purchaseOrder[ <!ELEMENT purchaseOrder (shipTo,billTo)*> (!ATTLIST purchaseOrder orderDate NMTOKEN #REQUIRED> <!ELEMENT shipTo (name,address,zip)> <!ATTLIST shipTo country NMTOKEN #FIXED "US"> <!ELEMENT billTo (name,address,zip)> <!ATTLIST billTo country NMTOKEN #FIXED "US"> <!ELEMENT name #PCDATA> <!ELEMENT address #PCDATA> <!ELEMENT zip #PCDATA> ]>
(DTD)
<xsd:schema xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <xsd:annotation> <xsd:documentation> Purchase order schema for Example.com. Copyright 2000 Example.com. All rights reserved. </xsd:documentation> </xsd:annotation> <xsd:element name="purchaseOrder" type="PurchaseOrderType"/> <xsd:complexType name="PurchaseOrderType"> <xsd:element name="shipTo" type="Address"/> <xsd:element name="billTo" type="Address"/> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType> <xsd:complexType name="Address"> <xsd:element name="name" type="xsd:string"/> <xsd:element name="address" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> <xsd:attribute name="country" type="xsd:NMTOKEN" use="fixed" value="US"/> </xsd:complexType> </xsd:schema >
(XML Schema)
<module
moduleVersion="1.2"
relaxCoreVersion="1.0"
targetNamespace=""
xmlns="http://www.xml.gr.jp/xmlns/relaxCore">
<interface>
<export label="purchaseOrder"/>
</interface>
<elementRule role="purchaseOrder">
<sequence occurs="*">
<ref label="shipTo"/>
<ref label="billTo"/>
</sequence>
</elementRule>
<elementRule role="shipTo">
<sequence>
<ref label="name"/>
<ref label="address"/>
<ref label="zip"/>
</sequence>
</elementRule>
<elementRule role="billTo">
<sequence>
<ref label="name"/>
<ref label="address"/>
<ref label="zip"/>
</sequence>
<;/elementRule>
<elementRule role="name" type="string"/>
<elementRule role="address" type="string"/>
<elementRule role="zip" type="decimal"/>
<tag name="purchaseOrder">
<attribute name="orderDate" type="date">
<tag name="shipTo">
<attribute name="country" type="NMTOKEN">
</tag>
<tag name="billTo">
<attribute name="country" type="NMTOKEN">
</tag>
<tag name="name"/>
<tag name="address"/>
<tag name="zip"/>
</tag>
</module>
(RELAX)

