DTDの記述方法で悩んでいます。解決策を教えてください。

このQ&Aのポイント
  • DTDの記述方法で悩んでいます。XMLの要素とその内容を同時に規定する方法について教えてください。
  • XMLの要素にテキストのみを許可し、さらに子要素も許可する場合、DTDでどのように記述すればよいのか教えてください。
  • DTDで要素にテキストと子要素の両方を許可する記述方法を教えてください。エラーや無効な記述を排除したいです。
回答を見る
  • ベストアンサー

DTDの記述

こんにちは。 DTDの記述方法で悩んでいます。 以下のようなXMLをDTDで規定したいのですが、可能でしょうか。 <Elem></Elem> <Elem>ABC</Elem> <Elem> <Child>ABC</Child> <Child>DEF</Child> <Child>GHI</Child> </Elem> つまり、 <!ELEMENT Elem (#PCDATA)> と、 <!ELEMENT Elem (Child*)> を同時に規定したいのです。 <!ELEMENT Elem (#PCDATA|Child*)> だと、エラーになってしまいました。 また、 <!ELEMENT Elem (#PCDATA|Child)*> では、 <Elem>  ABC <Child>GHI</Child> </Elem> といった場合も有効になってしまいます。このケースは除外したいのです。 こういった場合の記述はどうしたらいいのでしょうか。 あるいはDTDでの記述は無理なのでしょうか。

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

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

  • ベストアンサー
回答No.1

>あるいはDTDでの記述は無理なのでしょうか。 うん、無理。XMLSchemaでも出来そうな気がしないような。 http://www.w3.org/TR/REC-xml/#NT-elementdecl http://www.w3.org/TR/REC-xml/#NT-Mixed http://www.w3.org/TR/REC-xml/#NT-children

titokani
質問者

お礼

ご回答ありがとうございます。 なるほど、#PCDATAというのは特殊なんですね。 残念ではありますが、おかげさまですっきりしました。

関連するQ&A

  • DTDで、空要素をエラーしたい

    <title></title>のような形のXMLをDTDでエラーにしたいのですが、可能でしょうか? DTDで、 <!ELEMENT title (#PCDATA)> だと、エラーなくスルーしてしまいます。 よろしくお願いします。

    • ベストアンサー
    • XML
  • DTDの要素型宣言について

    今DTDの事を少しだけ勉強したのですが、少し疑問に思うことがありました。 documentを元にします。 DTDはまず<!ELEMENT document ()>と宣言すると習いました。その時、()の中に、…例えばtitle、body…などの要素を出現させる順に書かなくてはいけないのはわかりましたが、以下のように書かれていて分からなくなりました。 <!ELEMENT document (title, body)> <!ELEMENT title (#PCDATA)> <!ELEMENT body (chapter)> <!ELEMENT section (#PCDATA)> …… この場合はじめに宣言していた要素はtitleとbodyだけなのに、sectionも宣言していいのはなんででしょうか? documentで先に宣言しないといけない要素に決まりはあるのですか? よろしくお願いします。

  • 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
  • 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
  • DTDについて

    DTDでXMLのチェックをしようと思っているのですが、 あるタグ配下には、XHTMLのタグをすべてOKにしようとおもっています。その場合のDTDの書き方は、どうすればよいのでしょうか? やはり、すべてのタグを記述しなければ、いけないのでしょうか?(量が多いので、「チェックしない」とかって方法があれば、それでもよいのですが) よろしくお願いします。

    • ベストアンサー
    • XML
  • XMLをDTDで検証しようとしたらエラー、何が悪いのかさっぱり(--#;)

    ◎Thread.xml <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE Thread SYSTEM "mybbs.dtd"> <Thread> <Response> <Name>暇人</Name> <Mail>暇人</Mail> <WebSite>http://www.yahoo.co.jp</WebSite> <Content> <h1>テスト</h1> <p>テスト</p> </Content> </Response> <Response> <Name>暇人2003</Name> <Mail>tomoyukibug@yahoo.co.jp</Mail> <WebSite>http://www.yahoo.co.jp</WebSite> <Content> <h1>テスト2</h1> <p>テスト2</p> </Content> </Response> </Thread> ◎mybbs.dtd <!ENTITY % xhtml-math-svg SYSTEM "xhtml-math-svg.dtd"> %xhtml-math-svg; <!ELEMENT Thread (Response)+> <!ELEMENT Content %body.content;> <!ELEMENT Email "( #PCDATA )" > <!ELEMENT WebSite "( #PCDATA )" > <!ELEMENT Name "( #PCDATA )" > <!ELEMENT Response (Name,Email,WebSite,Content)> 率直に聞きます。 自分のプログラム(文字数制限に付き、ソース公開不可、するなら補足で)がエラーが出るんですが、何が間違っているんでしょう? エラー内容:これは無効なコンテンツモデルです

  • 二次元配列の分割

    よろしくお願いします。 $hoge = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); というような配列があったとき、 abcが110以下のときと、110より大きい場合で分割した配列を 用意したいと考えてます。 具体的には、 $hoge1 = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), ); と $hoge2 = array( "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); に分割したいと考えています。 どのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • ホームページのhtml記述

    で、http://abc.def.ghi.jp/1234.mpgと記述しました。 ホームページでそれをクリックすると QuickTimeの音声だけが聞こえます。 気持ちとしてはVLCMediaPlyerでこの動画を見たいのですが アプリを指定することはできるのでしょうか?

  • 外部サブセットについて

    以下がxmlファイルです。 --------------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE 製品一覧 SYSTEM "s1.dtd"> <製品一覧> <タイトル>製品リスト</タイトル> <製品> <名前>シューズ</名前> <単価>10000</単価> <カテゴリ>靴</カテゴリ> <カテゴリ>カジュアル</カテゴリ> <補足>注文は1 ダース単位</補足> </製品> <製品> <名前>サンダル</名前> <単価>5000</単価> <カテゴリ>靴</カテゴリ> </製品> </製品一覧> --------------------------------------------- 上記のxml文書に文書型宣言を記述して、作成したDTDを外部サブセットとして適用して下さい。とのことです。 私が書いた外部サブセット(s1.dtd) --------------------------------------------- <?xml version="1.0" encoding="Shift_JIS"?> <!ELEMENT 製品一覧 (製品*)> <!ELEMENT 製品 (タイトル,名前,単価,カテゴリ,補足)> <!ELEMENT タイトル (#PCDATA)> <!ELEMENT 名前 (#PCDATA)> <!ELEMENT 単価 (#PCDATA)> <!ELEMENT カテゴリ (#PCDATA)> <!ELEMENT 補足 (#PCDATA)> --------------------------------------------- この外部サブセットではダメでした。 勉強する気は、あるのですが、教科書見てもわからず、先生に聞いても理解出来ず、友達もさっぱりわかってないみたいで... ヒントでも何でもお待ちしております。m(._.)m

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