• ベストアンサー

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に関わらず、 デフォルト値が指定された属性を含めることはできないのでしょうか?

  • ns18
  • お礼率53% (55/102)
  • XML
  • 回答数4
  • ありがとう数17

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

  • ベストアンサー
  • 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

  • SQL ServerのXMLスキーマがうまくいきません。

    「SQL Server 2005 Express」を使用しています。 次のようなスキーマをサーバーに登録して CREATE XML SCHEMA COLLECTION dbo.schema_test AS N'<?xml version="1.0" encoding="UTF-16"?> <xsd:schema targetNamespace="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" xmlns:xsd="http://www.w3.org/2001/XMLSchema" > <xsd:element name="root">  <xsd:complexType mixed="true">   <xsd:choice>    <xsd:element name="A" type="xsd:string" />    <xsd:element name="B" type="xsd:string" />    <xsd:element name="C" type="xsd:string" />   </xsd:choice>  </xsd:complexType> </xsd:element> </xsd:schema>' ; つぎのようなクエリを試したのですが、 「メッセージ 6913、レベル 16、状態 1、行 5 XML 検証: 要素 'root' の宣言が見つかりませんでした。場所: /*:root[1]」 というエラーメッセージが表示されてしまいます。 DECLARE @xml xml (dbo.schema_text) SET @xml = '<root> <A>AAA</A> <B>BBB</B> <C>ooo</C> </root> ' どなたか分かる方がいらっしゃいましたら、 アドバイスをお願いいたします。

  • XML Schema

    いつもお世話になっております。 わからないところがありますので教えてください。以下のXML Schemaで、 <xs:element ref="No" /> と参照しているのですが、参照先となるのは <xs:element ref="No" type="xs:NoType" /> だと思うのですが、自分はこれが <xs:element name="No" type="xs:NoType" /> ではないのかなって思っているのですが、どうなのでしょうか。 よろしくお願いします。 <?xml version="1.0" encoding="Shift_JIS"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  <xs:element name="Conference" type="ConferenceType" />  <xs:complexType name="ConferenceType">   <xs:sequence>    <xs:element name="Room" type="xs:string" />    <xs:element ref="No" />   </xs:sequence>  </xs:complexType>  <xs:element ref="No" type="xs:NoType" />  <xs:simpleType name="NoType">   <xs:restriction base="xs:float">    <xs:minExclusive value="10" />    <xs:maxExclusive value="15" />   </xs:restriction>  </xs:simpleType> </xs:schema>

    • ベストアンサー
    • XML
  • PHPでXMLデータ生成、スキーマで失敗

    PHPのDOMDocumentを使ってXMLデータを生成しています。 $dom->schemaValidate('xsdファイル'); で失敗してしまします。 どうしても原因がわからないので吐き出すデータを最小限にして試してみましたが状況が変わりませんでした。 スキーマは以下のようになっています。 <?xml version="1.0" encoding="Shift_JIS" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Response"> <xsd:complexType> <xsd:sequence> <xsd:element name="user" type="user_type" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="user_type"> <xsd:sequence> <xsd:element name="developerID" type="xsd:string" /> <xsd:element name="operation" type="xsd:string" /> <xsd:element name="User-Agent" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> そして吐き出されるxml形式のデータは、 <?xml version="1.0" encoding="Shift-JIS"?> <Response> <user> <developerID>testdeveloperID</developerID> <operation>testoperation</operation> <User-Agent>Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1</User-Agent> </user> </Response> 出てしまうエラーは、 Warning: DOMDocument::schemaValidate() [<a href='domdocument.schemavalidate'>domdocument.schemavalidate</a>]: The document has no document element. in "実行しているphpファイルのパス" on line 12 ちなみに実行phpの12行目には、 $dom->schemaValidate('xsdファイル'); があります。 スキーマを使用してのxmlデータ吐き出しは初めてなのでいろいろと戸惑っています。 何か解決方法もしくはエラーが出てしまう原因をご存知の方がいらっしゃいましたらアドバイスをいただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • XML
  • complexTypeは入れ子にできない?

    次のようなXML文書を実現する為のXML Schemaを伺っても宜しいでしょうか。 <Test> <A>0</A> <!-- 唯一の要素--> <B>0</B> <!-- 反復要素 --> <C>0</C> <B>0</B> <C>0</C> : : </Test> で、下記のようなXML Schemaを書きましたが、文法エラーになります。 <xsd:element name="Test"><xsd:complexType><xsd:sequence> <!-- 唯一の要素 --> <xsd:element name="A" type="Int"/> <!-- 反復要素 --> <xsd:complexType><xsd:sequence> <xsd:element name="B" type="Int"/> <xsd:element name="C" type="Int"/> </xsd:sequence></xsd:complexType> </xsd:sequence></xsd:complexType></xsd:element> この解決方法をお教え頂けないでしょうか?どうか宜しくお願い致します。

    • ベストアンサー
    • XML
  • PHPでXMLデータ生成、スキーマで失敗

    PHPのDOMDocumentを使ってXMLデータを生成しています。 $dom->schemaValidate('xsdファイル'); で失敗してしまします。 どうしても原因がわからないので吐き出すデータを最小限にして試してみましたが状況が変わりませんでした。 スキーマは以下のようになっています。 <?xml version="1.0" encoding="Shift_JIS" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Response"> <xsd:complexType> <xsd:sequence> <xsd:element name="user" type="user_type" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="user_type"> <xsd:sequence> <xsd:element name="developerID" type="xsd:string" /> <xsd:element name="operation" type="xsd:string" /> <xsd:element name="User-Agent" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> そして吐き出されるxml形式のデータは、 <?xml version="1.0" encoding="Shift-JIS"?> <Response> <user> <developerID>testdeveloperID</developerID> <operation>testoperation</operation> <User-Agent>Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1</User-Agent> </user> </Response> 出てしまうエラーは、 Warning: DOMDocument::schemaValidate() [<a href='domdocument.schemavalidate'>domdocument.schemavalidate</a>]: The document has no document element. in "実行しているphpファイルのパス" on line 12 ちなみに実行phpの12行目には、 $dom->schemaValidate('xsdファイル'); があります。 スキーマを使用してのxmlデータ吐き出しは初めてなのでいろいろと戸惑っています。 何か解決方法もしくはエラーが出てしまう原因をご存知の方がいらっしゃいましたらアドバイスをいただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • XMLスキーマのrefの使い方

    こんにちは。yukimura1024です。 以下のXMLスキーマなんですが「Aの下にBを置ける」という意味でrefを使っています。 しかしこの書き方では「ルート要素としてAもBも使える」という意味でも解釈されてしまいます。 これをrefを使いつつ「Aの下にBを置ける」けど「ルート要素はAのみ」とするにはどう書けばいいでしょうか? <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  <xs:element name="A">   <xs:complexType>    <xs:sequence>     <xs:element ref="B"/>    </xs:sequence>   </xs:complexType>  </xs:element>  <xs:element name="B">   <xs:complexType>    <xs:sequence>     <xs:element name="C" type="xs:string"/>    </xs:sequence>   </xs:complexType>  </xs:element> </xs:schema> アドバイスいただける方いましたらお願いします。

    • 締切済み
    • XML
  • XML Schemaの名前空間

    XML Schemaを利用する際、名前空間としてhttp://www.w3.org/2001/XMLSchemaを定義する必要があります。上記の末尾に.xsdを追加し、ブラウザで開くと、組み込みデータ型が定義してあるファイルを参照できます。XML Schemaを利用してXMLの検証を行うアプリは、名前空間を元にこのファイルを参照して、組み込みデータ型の検証を行うのでしょうか。いまいち挙動がわかりません。

    • 締切済み
    • XML
  • XMLファイルからXML Schemaを参照する方法?

    XMLファイルの設計をしています。 今まではDTDを使っていたのですが、 勉強するとXML SchemaのほうがXMLの規則にそっていたり、 データ型が多かったりして都合が良い面があると学びました。 そこでXML Schemaを使いたいと思うのですが、 XML SchemaとメインのXMLのファイルはどのように関係させたら良いのでしょうか? DTDのときは以下のように書いていたと思います。 <!DOCTYPE root SYSTEM "sample.dtd" > このような記述をXML Schemaのときには、どのように記載するのだろうと 疑問に思いました。 私なりに調べてみたのですが、 XML Schemaの記述方法は、大まかに理解したのですが、 関係方法をどうすれば良いかは、見つけられませんでした。 本を読んでも、書かれているように思えません。 以下の2つのファイルがあった場合、 【element1.xml】は妥当なXML文書だそうですが、 どのように関連付いているのでしょうか? 【element.xs】 <?xml version="1.0" encoding="Shift_JIS" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 要素宣言 --> <xs:element name="売上高" type="xs:integer" /> </xs:schema> 【element1.xml】 <?xml version="1.0" encoding="Shift_JIS" ?> <売上高>1000</売上高> もしよろしければ、教えて頂けませんか? ぜひご教示お願いいたします。

    • ベストアンサー
    • XML
  • XMLの処理について

    javaでxmlをsoapで投げる処理をしています。 <クライアント> DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.parse( new File( "test.xml" ) ); Element elm = doc.getDocumentElement(); result = WebService( elm ); <サーバ> public Object WebService( Element elm ) { return 'elmを処理した結果'; } このクライアントの処理をperlで行いたいのですが、可能でしょうか?  : $service = SOAP::Lite->Service( "xxx.wdsl" ); open( XML, "test.xml" ); @xml = <XML>; ?? ここの処理はどうすれば ?? result = $service.WebService( @xml );  :

  • 子要素が順不同の場合のXML Schema の定義

    OpenSearch description documents の XML Schema を作成中なのです。ルート要素の <OpenSearchDescription> の各子要素について、出現回数の定義があるのですが、各要素の出現は順不同なのです。 <xsd:element name="OpenSearchDescription"> <xsd:annotation> <xsd:documentation source="https://github.com/dewitt/opensearch/blob/master/opense arch-1-1-draft-6.md#opensearch-description-elements"> The root node of the OpenSearch description document. </xsd:documentation> </xsd:annotation> <xsd:complexType> <xsd:?> <xsd:element ref="ShortName" minOccurs="1" maxOccurs="1" /> <xsd:element ref="Description" minOccurs="1" maxOccurs="1" /> <xsd:element ref="Tags" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Contact" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Url" minOccurs="1" maxOccurs="unbounded" /> <xsd:element ref="LongName" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Image" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="Query" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="Developer" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Attribution" minOccurs="0" maxOccurs="1" /> <xsd:element ref="SyndicationRight" minOccurs="0" maxOccurs="1" /> <xsd:element ref="AdultContent" minOccurs="0" maxOccurs="1" /> <xsd:element ref="Language" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="OutputEncoding" minOccurs="0" maxOccurs="unbounded" /> <xsd:element ref="InputEncoding" minOccurs="0" maxOccurs="unbounded" /> </xsd:?> <xsd:anyAttribute namespace="##any" processContents="skip" /> </xsd:complexType> </xsd:element> 具体的には上記のような内容なのですが、xsd:? の部分にどのように記述すればよいでしょうか。 sequence, choice, all のどれを使用しても上手くいきません。解決方法をご教示頂ければ幸いです。

    • ベストアンサー
    • XML

専門家に質問してみよう