🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ドキュメント

ドキュメントは、IT用語では、ソフトウェアやハードウェアに関する情報であり、意図された目的、機能性、メインテナンスを含みます。ドキュメントは、多くの様々なフォームとフォーマットに存在しますが、その目的は常に教育することにあります。

Q&A

解決済

2回答

1228閲覧

xmlドキュメントとDTDファイルの府もづけ

coala

総合スコア8

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ドキュメント

ドキュメントは、IT用語では、ソフトウェアやハードウェアに関する情報であり、意図された目的、機能性、メインテナンスを含みます。ドキュメントは、多くの様々なフォームとフォーマットに存在しますが、その目的は常に教育することにあります。

0グッド

0クリップ

投稿2021/03/30 05:13

編集2021/03/31 09:24

xmlドキュメントとDTDファイルをつなげるとエラーが起きてしまいます。
理由としては、マークアップが整形式ではないと出ています。
また、xmlドキュメントの<!DOCTYPE>を削除するとエラーはなくなるのですが、
削除するとDTDファイルと関連づけができなと思うのでどうすれば紐づけができますか?

tweets.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE tweets SYSTEM "tweets.dtd"> <tweets> <tweet id = "544442131960856577"> <text>#ESCORPIO: te encanta vivir una vida extrema. Tienes demasiadas historias para contar. No se aburren contigo...Te pasan cosas muy raras</text> <user> <id>2401782659</id> <name>Tu Hor\u00f3scopo Diario</name> <followers_count>196943</followers_count> <favourites_count>4</favourites_count> <friends_count>15</friends_count> </user> <place/> <retweet_count>3813</retweet_count> <retweetUser> <id>376496514</id> <name>Chucho </name> <followers_count>12894</followers_count> <favourites_count>19270</favourites_count> <friends_count>827</friends_count> </retweetUser> </tweet> <tweet id = "545020410358558720"> <text>We absolutely love our besties at @MTV! Of course you can be our honorary Sixth Harmony member \ud83d\ude09\ud83d\ude18 http://t.co/3OXzeKkq08</text> <user> <id>872374136</id> <name>Fifth Harmony</name> <followers_count>1688009</followers_count> <favourites_count>2788</favourites_count> <friends_count>16623</friends_count> </user> <place/> <retweet_count>1170</retweet_count> <retweetUser> <id>2771145881</id> <name>IGNORED BY 5H AND 5H</name> <followers_count>2121</followers_count> <favourites_count>2967</favourites_count> <friends_count>1886</friends_count> </retweetUser> </tweet> <tweet id = "545023385622044672"> <text>Backshot ah yuh favorite position</text> <user> <id>224086487</id> <name>Soph Andretti </name> <followers_count>633</followers_count> <favourites_count>140</favourites_count> <friends_count>406</friends_count> </user> <place/> <retweet_count>1</retweet_count> <retweetUser> <id>55963894</id> <name>December 27 ;</name> <followers_count>1645</followers_count> <favourites_count>2462</favourites_count> <friends_count>1043</friends_count> </retweetUser> </tweet> <tweet id = "538224475423399936"> <text>La necesidad de demostrar a todo el mundo lo que vales se llama inseguridad.</text> <user> <id>932737622</id> <name>Manuelhuga</name> <followers_count>2719</followers_count> <favourites_count>89729</favourites_count> <friends_count>215</friends_count> </user> <place/> <retweet_count>817</retweet_count> <retweetUser> <id>17632413</id> <name>Alejandra Alfaro</name> <followers_count>182</followers_count> <favourites_count>55</favourites_count> <friends_count>240</friends_count> </retweetUser> </tweet> </tweets>

tweets.dtd

<!ELEMENT tweets (tweet*)> <!ELEMENT tweet (text, user, place, retweet_count, retweetUser)> <!ELEMENT text (#PCDATA)> <!ELEMENT user (id, name, followers_count, favourites_count, friends_count)> <!ELEMENT id (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT followers_count (#PCDATA)> <!ELEMENT favourites_count (#PCDATA)> <!ELEMENT friends_count (#PCDATA)> <!ELEMENT place (#PCDATA)> <!ELEMENT retweet_count (#PCDATA)> <!ELEMENT retweetUser (id, name, followers_count, favourites_count, friends_count)> <!ELEMENT id (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT followers_count (#PCDATA)> <!ELEMENT favourites_count (#PCDATA)> <!ELEMENT friends_count (#PCDATA)> <!ATTLIST tweet id CDATA #REQUIRED>

JSON file

{ "created_at":"Wed Dec 17", "id":545025256960, "id_str":"5450256960", "text":"hello world", "user":{ "id":275881, "id_str":"275881", "name":"Json", }, "retweeted_status":{ "created_at":"Wed Dec 16", "id":545020558720, "id_str":"545058558720", "text":"twitter", "user":{ "id":874136, "id_str":"874136", "name":"Farmony", "screen_name":"Fiftony", } } } {....... }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

etherbeg

2021/03/30 11:06

マークアップが整形式ではないというエラーは何のソフトで出ていますか? 私の環境では特にエラーは出ませんが…。 そのエラーと関係あるかどうか分かりませんが、同じ要素の定義は1回だけでいいのではないでしょうか。 <!ELEMENT tweets (tweet*)> <!ELEMENT tweet (text, user, place, retweet_count, retweetUser)> <!ELEMENT text (#PCDATA)> <!ELEMENT user (id, name, followers_count, favourites_count, friends_count)> <!ELEMENT id (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT followers_count (#PCDATA)> <!ELEMENT favourites_count (#PCDATA)> <!ELEMENT friends_count (#PCDATA)> <!ELEMENT place (#PCDATA)> <!ELEMENT retweet_count (#PCDATA)> <!ELEMENT retweetUser (id, name, followers_count, favourites_count, friends_count)> <!ATTLIST tweet id CDATA #REQUIRED>
coala

2021/03/30 12:32 編集

ご確認いただきありがとうございます。Xcodeを使っています。JSONファイルからDTDを作成したのですが、JSONファイルからDTDのATTLISTを認識する方法などありますか?
etherbeg

2021/03/30 12:52

うーん、質問に貼られているXMLとDTDをそのままコピーしたファイルを作って、Xcodeで開いてみましたが、エラー出ないですね…。tweets.xmlとtweets.dtdを同じディレクトリに置いて、tweets.xmlを右クリックからXcodeで開いたのですが、開き方が間違っていますか? 同じ要素の定義は1回だけというのは、id, name, followers_count, favourites_count, friends_count のそれぞれの定義のことです。今は2回定義してますよね(例えば <!ELEMENT id (#PCDATA)> が2回出てくる)。 あと、整形式でないというエラーは、DTDは関係なくて、閉じタグが抜けてるとか、そもそもちゃんとXMLの形式になってない時に出るエラーだったように思います。
coala

2021/03/30 22:32

わざわざXcodeを使ってご確認いただきありがとうございます。xcodeのバージョンを更新したらエラーがなくなりました。何度もご確認いただき本当にありがとうございました。
etherbeg

2021/03/31 08:57

解決されたのなら良かったです。 追加のコメントは見逃しておりました。JSONファイルからDTDのATTLISTを認識するとはどういう意味ですか? イメージが湧かないので、やりたいことの具体的なイメージや目的など、説明を追加していただければ一緒に考えさせていただきます。もしもう不要であれば返事も不要ですので、そのままスルーしていただいて結構です。
coala

2021/03/31 09:28

質問のところにjsonfileを追加しました。jsonfileからどのようにDTDの<ATTLISTを見つければいいのですか?<ATTLISTはPKと考えて大丈夫でしょうか。jsonfileから要素<!ELEMENTを見つけるのは容易でしたが、<!ATTLISTを見つける方法がわかりません。勝手に<!ATTLISTは定義してしまって良い物でしょうか。
etherbeg

2021/03/31 12:17

ご質問の背景がよく分からないのですが、JSON形式のデータファイルとDTDファイルがあらかじめ与えられていて、DTDに従ってJSON形式のデータファイルをXML形式に変換しないといけないとか、そういうことでしょうか? ご質問のサンプルデータをみる限りでは、JSONのデータ構造とXMLのデータ構造は一対一で対応しているわけではないようですので、双方のデータ構造とデータの意味をよく理解した上で、ひとつひとつJSONのキーと、XMLの要素(と属性)の対応づけを行っていくしかないのではないでしょうか。キーや要素の名前も手がかりにはなると思いますが、同じ意味内容のデータが必ずJSONとXMLで同じ名前である保証もないですし。対応づけを行った結果として初めて、JSONでのこのキーが、XMLではtweet要素のid属性になるのだなあと分かるのだと思います。機械的に判断できるものでもないし、勝手に決めていいものでもないと思います。 ご質問の意図と違う回答でしたら申し訳ありません。 ちなみにXMLにおいてあるデータを要素にするか属性にするかに決まった答えがあるわけではありません。それはそのXMLのデータ構造を設計した者が決めます。属性を必ず使わないといけないわけでもありません。
coala

2021/04/01 01:23

ご回答ありがとうございます。Jsonファイルだけ与えられてそこからDTDやxml文書を作成する必要がありました。質問の背景を細かく説明することができず申し訳ありません。xmlにおいて要素にするか属性にするかは、設計者がきめるということで、なにか規則があるわけではないこと理解しました。ありがとうございます。
etherbeg

2021/04/01 12:48

なるほど、分かりました。こちらこそ失礼しました。 私は自分でXMLスキーマの設計をした経験はないので、受け売りの知識をご紹介することしかできないのですが、『XML教科書』(朝倉浩志他著、ソフト・リサーチ・センター、2002年)という本の第4章「XMLの設計」の中に、要素と属性の使い分けに触れた箇所があります。以下に内容をまとめてみます。 ・使い分けに明解な解答はない ・要素と属性それぞれの特徴に基づいて使い分ける ・要素の特徴  - 同名の要素を兄弟に持つことができる  - 内容に構造を持つことができる  - 兄弟要素間の出現順に意味を持たせられる ・属性の特徴  - 1つの要素は同名の属性を複数持つことができない  - 値に構造を持つことができない  - 開始タグ内での出現順に意味がない  - 属性固有のデータ型を持つ  - 要素に対して従属的な属性とそうでない属性がある  - DTDによるデフォルト値を持つことができる ・データ系XMLの場合は基本的にすべてを要素で表現する ・データ系XMLではプログラムでの利用のしやすさを第一に考える ・データ系XMLで属性が必要になるのは次のような特殊な場合のみ  - xml:lang属性やxml:space属性、名前空間宣言など、XMLの仕様に含まれる属性を使用するとき  - 要素のインスタンスへのアクセスや参照を容易にするために、要素にIDを振るとき。これはあくまでも要素のIDであり、データに含まれるIDではない。従業員のIDが従業員番号であるからといって、従業員番号を従業員要素の属性とする必要はない  - 要素自身に強く従属している値を表現したいとき。例えば、実装上の理由から、本来は必要ないがアプリケーションがデータを処理する際に必要になる情報を、要素に待たせなければならない場合 ・文書系XMLの場合も基本的に属性を使う必要性はほとんどない ・例外は以下の場合  - 表示させたくない情報を属性とするとき。CSSを用いてXMLを表示させる際に、デフォルトでは属性はブラウザ上に表示されない  - データ系XMLと同様に、要素自体にIDを持たせたいとき  - マークアップ対象の文書に表示されている文字列は要素内容とし、それ以外の情報は属性とする、という古くからある慣習に従うとき 以上です。実際に実務の現場でどう判断され、どう実装されているかは判らないのですが…。少しでも参考になれば幸いです。
coala

2021/04/03 01:00

とてもわかりやすにご説明頂きありがとうございました。ベストアンサーとさせて頂きたいのですが、回答欄に再度記載いただくことは可能でしょうか。よろしくお願い致します。
etherbeg

2021/04/03 13:19

回答欄に記載しました。
guest

回答2

0

ベストアンサー

標題の質問への直接の回答ではないのですが、コメント欄で要素と属性の使い分けについて質問がありましたので、受け売りにはなりますが、手元にあった『XML教科書』という本から、要素と属性の使い分けについて触れた箇所を要約して紹介します。


  • 使い分けに明解な解答はない

  • 要素と属性それぞれの特徴に基づいて使い分ける

  • 要素の特徴

 -- 同名の要素を兄弟に持つことができる
-- 内容に構造を持つことができる
-- 兄弟要素間の出現順に意味を持たせることができる

  • 属性の特徴

 -- 1つの要素に同名の属性を複数持つことはできない
-- 値に構造を持つことができない
-- 開始タグ内での出現順に意味がない
-- 属性固有のデータ型を持つ
-- 要素に対して従属的な属性とそうでない属性がある
-- DTDによるデフォルト値を持つことができる

  • データ系XMLの場合は基本的にすべてを要素で表現する
  • データ系XMLではプログラムでの利用のしやすさを第一に考える
  • データ系XMLで属性が必要になるのは次のような特殊な場合のみ

 -- xml:lang属性やxml:space属性、名前空間宣言など、XMLの仕様に含まれる属性を使用するとき
-- 要素のインスタンスへのアクセスや参照を容易にするために、要素にIDを振るとき。これはあくまでも要素のIDであり、データのIDではない。従業員のIDが従業員番号であるからといって、従業員番号を従業員要素の属性とする必要はない
-- 要素自身に強く従属している値を表現したいとき。例えば、実装上の理由から、アプリケーションがデータを処理する際に必要になる情報を、本来は必要ないが要素に待たせなければならない場合

  • 文書系XMLの場合も基本的に属性を使う必要性はほとんどない
  • 例外は以下の場合

 -- 表示させたくない情報を属性とするとき。CSSを用いてXMLを表示させる際に、デフォルトでは属性はブラウザ上に表示されない
-- データ系XMLと同様に、要素自体にIDを持たせたいとき
-- 古くからある慣習に従って、マークアップ対象の文書に表示されている文字列は要素内容とし、それ以外の情報は属性とするとき

『XML教科書』(朝倉浩志・志村壮是・山本陽平著、ソフト・リサーチ・センター、2002年)より
「第4章 XMLの設計 - 4.4.3 要素と属性」

投稿2021/04/03 13:05

編集2021/04/03 13:10
etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tweets.dtdは、

DTD

1<!DOCTYPE tweets 2[ 3 <!ELEMENT tweets (tweet*)> 4 <!ELEMENT tweet (text, user, place, retweet_count, retweetUser)> 5 : 6 <!ELEMENT friends_count (#PCDATA)> 7 <!ATTLIST tweet id CDATA #REQUIRED> 8]>

のようにtweetsがルートノードであることを示す必要があります。

投稿2021/03/30 07:32

seastar3

総合スコア2287

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coala

2021/03/30 12:34

ご回答ありがとうございます。ご指摘いただいたとおり修正を行いましたが、エラーは解消されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問