• ベストアンサー

DTDとXML Schemaでのデフォルト値の指定について

以下のようなXMLをパーズするプログラムがあります。 ------------------------------------------------------------------ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(true); DocumentBuilder documentBuilder = factory.newDocumentBuilder(); Document doc = documentBuilder.parse(new InputSourc("a.xml")); ------------------------------------------------------------------ a.xmlに以下のようなXMLの構造をDTDで指定した場合のxmlをパーズさせると、 <!DOCTYPE a [ <!ELEMENT a (#PCDATA)> <!ATTLIST a a1 CDATA "abc"> ]> <a/> 上記のプログラム3行目のvalidationの設定がtrue、falseに関わらす、 <a a1="abc"/> というような形式のドキュメントオブジェクトが返ってきます。 ですが、以下のようにXMLの構造をXML Schemaで定義した場合、 a.xml <a xsi:noNamespaceSchemaLocation="b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> b.xsd <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="a"> <xsd:complexType> <xsd:attribute name="a1" type="xsd:string" default="abc"/> </xsd:complexType> </xsd:element> </xsd:schema> 返ってくるドキュメントオブジェクトのa要素には、validationがtrueの場合はa1属性が含まれる、falseの場合は含まれません。 これは正しい動作なのでしょうか? また、XML Schemaの場合もvalidationがtrue、falseに関わらず、 デフォルト値が指定された属性を含めることはできないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.2

XML 1.0では、validationしないプロセッサのDTDに対する動作に関して、以下のような記述があります。(5.1 Validating and Non-Validating Processorsより) Non-validating processors are required to check only the document entity, including the entire internal DTD subset, for well-formedness. つまり、internal DTD subsetの中ならば、validationしなくてもデフォルト値などは使わなければならず、externalの中ならば必須ではない(もしかしたらやってくれる場合もあるかもしれないのですが)、ということになります。 一方、XML Schemaの具体的な記述は見つかりませんでしたが(なにしろ量が多いので)、デフォルト値のような情報追加について、以下のような記述があります。 (2.3 Constraints and Validation Rulesの、Schema Information Set Contributionの定義より) Augmentations to post-schema-validation infosets expressed by schema components, which follow as a consequence of validation and/or assessment. これを読む限り、validationを行なわないとデフォルト値は追加されないように読めます。 XML Schemaを使いつつ、validationしない時にデフォルト値だけは埋めたい場合には、デフォルト値を与える宣言だけを記述したinternal DTD subsetと組み合わせるしかないかもしれません。冗長になりますが。 ※載せた英文は、以下の2つのURLから引用しました。 http://www.w3.org/TR/2000/REC-xml-20001006    XML 1.0(Second Edition) http://www.w3.org/TR/2001/REC-xmlschema-1-20010502    XML Schema Part 1: Structures

ns18
質問者

お礼

返事が遅くなって申し訳ありません。 XML Schemaについて詳しい説明があるのは英語のものばかりなので、 なかなか読む気になりません。。。 これからは英語の文書をよく読んで調べてから質問したいと思います。 ありがとうございました。

その他の回答 (3)

  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.4

元の質問とあまり関係なくなっちゃいますが。 私の理解では、あの引用部分は、entityの解決のために読み込まないという意味ではなく、external DTD subsetを読み込むことが必須でないことを表していると思って引用しました。たぶん段落の前後でentityが盛んに出てくるからだと思いますが、external DTD subsetもentityなので。 external DTD subsetが読み込まれることが必須でないから、その結果external DTD subsetに記述されたデフォルト値は認識されないかもしれない、という意味だったのですが、分かりにくかったでしょうか。 2.9 Standalone Document Declarationのところを引用しても良かったのですが、説明が長くなりそうだったので、すみません。 ちなみに、XML SchemaをDTDと組み合わせることができることに触れたのは、DTDと組み合わせた場合にXML Schemaがexternal DTD subsetみたいに扱われるとみなせば、一応整合性がとれていると言えるかも、という意味でもあります。

参考URL:
http://www.w3.org/TR/2000/REC-xml-20001006
  • tekebon
  • ベストアンサー率62% (36/58)
回答No.3

#2の方の揚げ足を取るわけではありませんがXML1.0について引用された記述はentityについての記述であって属性の宣言についての記述ではないと思います。 まぁ、実体参照(entity)については処理しなくちゃいけないということで間違ってはいないと思いますが。

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.1

XML1.0の規格では「文書内で属性が指定されていないときにXMLプロセッサがどう処理しなければならないかまたは処理するほうがいいかの情報も与える。」となっているようなのでDTDに記述された内容は妥当性の検証をおこなうかどうかにかかわらずdefault値が摘要されるようです。(質問では内部DTDで記述されていますが外部DTDであったばあい、妥当性の検証を行わなかったときの処理がどうなっているかは覚えていません) 一方、XML Schemaでは妥当性の検証を行う際に参照されるので検証しない場合には適用されないとなっているようです。 自信がないのでURLを紹介しておきます XML1.0 英語: http://www.w3.org/TR/REC-xml 日本語: http://www.fxis.co.jp/DMS/sgml/xml/rec-xml.html XML Schema Part 0: 英語: http://www.w3.org/TR/xmlschema-0/ 日本語(ただし草案): http://www.trl.ibm.com/projects/xml/xmlschema-0j.html

ns18
質問者

お礼

返事が遅くなって申し訳ありません。 XML Schemaがそういう仕様になっているのであれば、しょうがないですね。 今自分の作っているものがそういう動作をするのはXML Schemaが そうだから・・・と上司への言い訳ができました。(~O~) ありがとうございました。

関連するQ&A