XMLのDTDによる文書型宣言の記述の仕方

このQ&Aのポイント
  • XMLのDTDによる文書型宣言の記述について詳しく教えてください
  • XMLのDTDで同じ要素名の要素で属性が異なる場合の記述方法について教えてください
  • XMLのDTDで要素Dの宣言を正しく行う方法について教えてください
回答を見る
  • ベストアンサー

XMLのDTDによる文書型宣言の記述の仕方

初心者ですが簡単なXMLのDTDによる文書型宣言の記述の仕方がよく分かりませんので教えてください。 XMLでは同じ要素名の要素でも親が異なる場合は別の要素として扱うことができます。例えば、要素Bの子の要素Dと、要素Cの子の要素Dがある場合、要素Bの子の要素Dには属性bdを、要素Cの子の要素Dには属性cdを定義できます。この場合にDTDによる文書型宣言を記述する場合、要素Bの子の要素Dと、要素Cの子の要素Dをどのように記述するのでしょうか。 例えば <A>  <B>   <D bd="123"></D>  </B>  <C>   <D cd="abc"></D>  </C> </A> というようなXMLインスタンスがあった場合 この場合のDTDによる文書型宣言の記述は <!DOCTYPE A [  <!ELEMENT A (B,C)>  <!ELEMENT B (D)>  <!ELEMENT D EMPTY>  <!ATTLIST D bd CDATA #REQUIRED>  <!ELEMENT C (D)>  <!ELEMENT D EMPTY>  <!ATTLIST D cd CDATA #REQUIRED> ]> と記述しましたがこれでは駄目でした。2つ目の要素DのELEMENTの宣言で、要素Dはすでに宣言されているというエラーになるのです。上記の例の場合にDTDによる文書型宣言はどのように記述するのでしょうか。 よろしくお願い致します。

  • XML
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

「XMLでは親が異なる場合にはその子孫には同じ名前の要素を配置してはいけないのでしょうか。」 配置してもいいし、どちらかというと、配置できるから XML がデータ形式として使いやすいので、どんどん活用するといいとおもう。 「これが正しければこの回答で納得するのですが、どのパーサーも整形式XML文書であると判定しているようなのでXMLでは許されているように思われます。」 Yes。 「解説の中で各宣言はどの順番に記述してもよいと説明されていたのをみて、これでは同じ名前の異なる要素の親と子の対応関係がどうように分かるのか疑問に思っていましたが未だによく分からないままです。」 DTD の基本方針は、 『すべて許可』の状態から、少しずつ『制限を追加』していく と考えると、わかりやすいかも。 例えば、いくつかの仕入先から入荷できる果物の定義は、…… <!ELEMENT from (warehouser_A|warehouser_B)> <!ELEMENT warehouser_A (apple|orange)> 卸問屋A からは、(りんご、または、オレンジ)だけ。 <!ELEMENT warehouser_B (apple|orange|peach)> 卸問屋B からは、(りんご、オレンジ、または桃)だけ。 『要素名にする』か、それとも『要素名を同じにして、ユニークな属性にする』か というところで、質問者さんはモヤモヤしているような気がするけど、 上の例のようなデータの制限をしたいなら、DTD は『要素名にする』を強制してる。 でも、こんな制限は、はっきりいって苦痛。 ↓ (なので) ↓ XML Schema などなど。。。 「このことは親と子の対応関係だけでなく要素と属性の対応関係にも言えます。このような基本的な構造がDTDで表記できないというのもDTDの仕様として変な気がします。」 DTD の表現上の制限だから。。。ずばり、それが仕様! 問答無用の絶対的存在。 「DTDでは記述できないというようなことが仕様のどこかに明記されているのでしょうか。できればその理由も分かると今後のDTDの理解にも役立ちます。」 『○○はできない。』なんて書かれてなくても、 できることが『全て』書かれているのだから、 できないことは論理的に導けるでしょ?

yam2012
質問者

お礼

XMLは学習したばかりなので、DTDの記述の仕方が分からないと思っていましたが、このような構造は元々DTDでは記述することができなかったわけですね。ありがとうございました。 【追記】XML_Schemaのことが書かれていましたのでXML_Schemaでも確認してみました。コード量が増えた分複雑に見えますが、構造的には把握しやすいです。 ------------------------------------------------------------------ <?xml version="1.0" encoding="shift_jis" standalone="no" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  <xs:element name="A">   <xs:complexType>    <xs:sequence> <!--B-->     <xs:element name="B">      <xs:complexType>       <xs:sequence >        <xs:element name="D">         <xs:complexType>          <xs:sequence>          </xs:sequence>          <xs:attribute name="bd" type="xs:integer" use="required" />         </xs:complexType>        </xs:element>       </xs:sequence>      </xs:complexType>     </xs:element> <!--C-->     <xs:element name="C">      <xs:complexType>       <xs:sequence >        <xs:element name="D">         <xs:complexType>          <xs:sequence>          </xs:sequence>          <xs:attribute name="cd" type="xs:string" use="required" />         </xs:complexType>        </xs:element>       </xs:sequence>      </xs:complexType>     </xs:element> <!---->    </xs:sequence>   </xs:complexType>  </xs:element> </xs:schema> ------------------------------------------------------------------

その他の回答 (2)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

あっ! bd cd 属性名ちがってた。。。 <!ATTLIST D bd CDATA #IMPLIED> <!ATTLIST D cd CDATA #IMPLIED> #REQUIRED はにすると省略できないからエラー。 B > D → bd #REQUIRED C > D → cd #REQUIRED という表現方法は DTD にはなし。 HTML では問題ないけど、 XML で表現できて、DTD で表現できない構造があるから、別のスキーマ言語が必要になったという経緯があるから、しょうがないとおもう。 でも、 『そもそも、別の属性を強要するなら、別の要素でいいじゃないか。』 という主張は、あながち間違いじゃない気もする。 ラベルが同じなのに、商品の中身が違ってたら混乱するでしょ?

yam2012
質問者

補足

ちょっとよく分からなくなってきましたので基本的なことを御聞きします。(本当に基本的なことなので回答しにくいかもしれませんが、よく分からないままにしておくと、いつまでたっても分からないままになってしまいそうな気がしましたので、いろいろ考えた末に質問することにしました) XMLでは親が異なる場合にはその子孫には同じ名前の要素を配置してはいけないのでしょうか。 これが正しければこの回答で納得するのですが、どのパーサーも整形式XML文書であると判定しているようなのでXMLでは許されているように思われます。 DTDを学習し始めた頃、解説の中で各宣言はどの順番に記述してもよいと説明されていたのをみて、これでは同じ名前の異なる要素の親と子の対応関係がどうように分かるのか疑問に思っていましたが未だによく分からないままです。このことは親と子の対応関係だけでなく要素と属性の対応関係にも言えます。このような基本的な構造がDTDで表記できないというのもDTDの仕様として変な気がします。DTDでは記述できないというようなことが仕様のどこかに明記されているのでしょうか。できればその理由も分かると今後のDTDの理解にも役立ちます。 よろしくお願いします。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

<!DOCTYPE A [ <!ELEMENT A (B,C)> <!ELEMENT B (D)> <!ELEMENT C (D)> <!ELEMENT D EMPTY> <!ATTLIST D bd CDATA #REQUIRED> ]> 各定義の順番は関係ないんじゃない? <!DOCTYPE A [ <!ATTLIST D bd CDATA #REQUIRED> <!ELEMENT D EMPTY> <!ELEMENT B (D)> <!ELEMENT C (D)> <!ELEMENT A (B,C)> ]>

yam2012
質問者

補足

教えていただきました2つの例を実際に検証して確認しましたがいずれもエラーになりました。 C要素の子であるD要素は属性が異なりますのでB要素の子であるD要素とは別物ですが、  <D cd="abc">の部分に相当するC要素の子であるD要素がcd属性を持つことを宣言するATTLIST宣言はどこに宣言されているのでしょうか。よろしくお願いします。

関連するQ&A

  • DTD作成について

    以下のXMLをDTDに使用としています。 B以降の設定の方法が分かりません。 よろしくお願い致します。 XML - <Aブロック> - <A a番号="01" b="xxxx" c="x"> <B 番号="1" d="xxxx" /> <B 番号="2" d="xxxx" /> <B 番号="3" d="xxxx" /> </A> DTD <!ELEMENT Aブロック (A*)> <!ELEMENT A EMPTY> <!ATTLIST A a CDATA #REQUIRED> <!ATTLIST A b CDATA #REQUIRED> <!ATTLIST A c CDATA #REQUIRED>

    • ベストアンサー
    • XML
  • XHTML1.1でのXML宣言とDTD宣言の書き方

    XML宣言によるレイアウトの崩れ等の質問はありましたが今回の質問と同じ内容は私には見当たらなかったため質問させて頂きます。 XHTMLでのXML宣言を <?xml version="1.0" encoding="utf-8"?> と記述しています。 上記の記述と <?xml version="1.0" encoding="UTF-8"?> とで、文字コードの大文字か小文字かの違いだけなのですがどちらの方が良いのでしょうか。 同じくDTD宣言を <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> と記述しています。 XMLでは大文字と小文字を区別して扱うため必ず半角で書かなければならないとされていますが、XHTMLでマークアップされているサイトのソースを見るとどこもXML宣言での文字コードとDTD宣言では大文字が使用されています。 細か過ぎるというのは分かっているのですが厳密にはどのような記載が正しいのでしょうか。 ※今回投稿カテゴリーの小カテゴリーにて”XML”を選択致しましたがXHTMLについての質問の場合”XML”と”HTML”どちらにするべきでしょうか。 合わせてご返答、又はご意見を頂戴できれば幸いです。

    • 締切済み
    • XML
  • DTDを記述する意味

    DTDを使ってXMLの形式を厳密に定義する方法があると聞いて試してみたのですが、記述した形式を破っても何も起きません。たとえば以下のように <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ELEMENT root (a, b, c+)> ]> <root> <b>BBB</b> <a>AAA</a> </root> と書いた場合、「A,B,Cという要素をこの順番で配置せよ」という命令と「Cという要素を1つ以上配置せよ」という2つの命令を無視していますが、何かしらのエラーを返すといった動作は全くありません。HTML(XHTML)みたいな感じです(テキトーにコーディングしてもエラーを返さない点)。XMLのDTDはそれを守らないとエラーを返すような動作はしないのでしょうか?それではDTDの存在意義が分からなくなってしまいますが・・・

    • 締切済み
    • XML
  • 妥当なXML文書

    XML文書で、下記のあ)い)で、妥当なXML文書は あ)になります。 では、い)は妥当ではないとしたら、どの部分が妥当ではないでしょうか。 これが理解できずに困っています。 <a/>は親要素にならないのでしょうか。ルートになるからでしょうか。 よろしくお願いします。 あ) <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE a [ <!ELEMENT a (b?)> <!ELEMENT b (#PCDATA)> ]> <a/> い) <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE a [ <!ELEMENT a (b?)> <!ELEMENT b (#PCDATA)> ]> <a/><b/>

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

    • ベストアンサー
    • XML
  • DTDと名前空間

    DTDと名前空間の関係について質問します。 XMLの本を読みDTDと名前空間の大まかなイメージを下記のようにつかみました。 DTD: XML文書の妥当性を規定し、DTD宣言で指定。 名前空間: ひとつのXML内で要素名の衝突を避けるために、xmlnsで指定。 XHTMLのDTD宣言 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> XHTMLの名前空間(http://www.w3.org/1999/xhtml) <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> XHTML文書の場合、DTDと名前空間がそれぞれひとつです。 しかし、ひとつのXMLドキュメントで複数の名前空間を利用する場合は、それぞれの名前空間に対して、DTDを宣言するのでしょうか。つまり複数のDTD宣言があるXMLドキュメントになるのでしょうか。 DTDと名前空間の関係が良く分かりません。 XML自体を勉強し始めたばかりで、まとまりのない質問で申し訳ありませんが、よろしくお願いします。

    • ベストアンサー
    • XML
  • DTDについて

    いつもお世話になっております。 以下のインスタンスに対して妥当なXML文書となるDTDはどれかという問題で、(1)は正解で(2)は不正解となっているのですが、自分は(2)がなぜ不正解なのかわかりません。正解じゃないの?と思っています。 お分かりになる方、お知恵を拝借できないでしょうか。よろしくお願いします。 (1)と(2)で違うのはinformationの子要素の出現回数が*か+かの違いです。 (インスタンス) <information><product>PC</product>と<product>モニタ</product>で<price>200000</price>円です。</information> (1) <?xml version="1.0"?> <!DOCTYPE information[ <!ELEMENT information (#PCDATA | product | price)*> <!ELEMENT product (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> (2) <?xml version="1.0"?> <!DOCTYPE information[ <!ELEMENT information (#PCDATA | product | price)+> <!ELEMENT product (#PCDATA)> <!ELEMENT price (#PCDATA)> ]>

    • ベストアンサー
    • 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
  • Perl での XML 処理での DTD 宣言につ

    Perl の XML::LibXML モジュールを使用して XML を処理しています。 例えば、 <?xml version="1.0" encoding="UTF-16" standalone="no"?> <!DOCTYPE aaa PUBLIC "-//bbb//CCCC//EN" "ddd.dtd" []> <doc> ....... </doc> のようなXMLに対してPerlで処理をして、 最後に documentElement を toString して書き出しています。 しかし、この場合、DTD宣言部分を書き出すことができません。 XML::LibXMLでこの部分を取得して書き出すことはできますでしょうか。 どうぞ、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文書型定義と文書型宣言について

    文書型宣言の中に、文書型定義が含まれるようですが、これらすべてを合わせてDTDと呼べばいいのでしょうか? 文書型定義はたいてい一行で、それ以下の外部エンティティ参照のほうが行数が増えるのでしょうか? 検証済み文書の場合での話しになってしまったかもしれませんが、 整形式だとこの、文書型宣言、文書型定義と、XML宣言が省略できるということでしょうか。 まだ勉強をはじめたばかりですが、 よろしくお願いいたします。

    • ベストアンサー
    • XML

専門家に質問してみよう