- ベストアンサー
XMLのDTDによる文書型宣言の記述の仕方
- XMLのDTDによる文書型宣言の記述について詳しく教えてください
- XMLのDTDで同じ要素名の要素で属性が異なる場合の記述方法について教えてください
- XMLのDTDで要素Dの宣言を正しく行う方法について教えてください
- みんなの回答 (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の理解にも役立ちます。」 『○○はできない。』なんて書かれてなくても、 できることが『全て』書かれているのだから、 できないことは論理的に導けるでしょ?
その他の回答 (2)
- dscripty
- ベストアンサー率51% (166/325)
あっ! 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 で表現できない構造があるから、別のスキーマ言語が必要になったという経緯があるから、しょうがないとおもう。 でも、 『そもそも、別の属性を強要するなら、別の要素でいいじゃないか。』 という主張は、あながち間違いじゃない気もする。 ラベルが同じなのに、商品の中身が違ってたら混乱するでしょ?
補足
ちょっとよく分からなくなってきましたので基本的なことを御聞きします。(本当に基本的なことなので回答しにくいかもしれませんが、よく分からないままにしておくと、いつまでたっても分からないままになってしまいそうな気がしましたので、いろいろ考えた末に質問することにしました) XMLでは親が異なる場合にはその子孫には同じ名前の要素を配置してはいけないのでしょうか。 これが正しければこの回答で納得するのですが、どのパーサーも整形式XML文書であると判定しているようなのでXMLでは許されているように思われます。 DTDを学習し始めた頃、解説の中で各宣言はどの順番に記述してもよいと説明されていたのをみて、これでは同じ名前の異なる要素の親と子の対応関係がどうように分かるのか疑問に思っていましたが未だによく分からないままです。このことは親と子の対応関係だけでなく要素と属性の対応関係にも言えます。このような基本的な構造がDTDで表記できないというのもDTDの仕様として変な気がします。DTDでは記述できないというようなことが仕様のどこかに明記されているのでしょうか。できればその理由も分かると今後のDTDの理解にも役立ちます。 よろしくお願いします。
- dscripty
- ベストアンサー率51% (166/325)
<!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)> ]>
補足
教えていただきました2つの例を実際に検証して確認しましたがいずれもエラーになりました。 C要素の子であるD要素は属性が異なりますのでB要素の子であるD要素とは別物ですが、 <D cd="abc">の部分に相当するC要素の子であるD要素がcd属性を持つことを宣言するATTLIST宣言はどこに宣言されているのでしょうか。よろしくお願いします。
お礼
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> ------------------------------------------------------------------