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", } } } {....... }
マークアップが整形式ではないというエラーは何のソフトで出ていますか? 私の環境では特にエラーは出ませんが…。
そのエラーと関係あるかどうか分かりませんが、同じ要素の定義は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>
ご確認いただきありがとうございます。Xcodeを使っています。JSONファイルからDTDを作成したのですが、JSONファイルからDTDのATTLISTを認識する方法などありますか?
うーん、質問に貼られている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の形式になってない時に出るエラーだったように思います。
わざわざXcodeを使ってご確認いただきありがとうございます。xcodeのバージョンを更新したらエラーがなくなりました。何度もご確認いただき本当にありがとうございました。
解決されたのなら良かったです。
追加のコメントは見逃しておりました。JSONファイルからDTDのATTLISTを認識するとはどういう意味ですか? イメージが湧かないので、やりたいことの具体的なイメージや目的など、説明を追加していただければ一緒に考えさせていただきます。もしもう不要であれば返事も不要ですので、そのままスルーしていただいて結構です。
質問のところにjsonfileを追加しました。jsonfileからどのようにDTDの<ATTLISTを見つければいいのですか?<ATTLISTはPKと考えて大丈夫でしょうか。jsonfileから要素<!ELEMENTを見つけるのは容易でしたが、<!ATTLISTを見つける方法がわかりません。勝手に<!ATTLISTは定義してしまって良い物でしょうか。
ご質問の背景がよく分からないのですが、JSON形式のデータファイルとDTDファイルがあらかじめ与えられていて、DTDに従ってJSON形式のデータファイルをXML形式に変換しないといけないとか、そういうことでしょうか?
ご質問のサンプルデータをみる限りでは、JSONのデータ構造とXMLのデータ構造は一対一で対応しているわけではないようですので、双方のデータ構造とデータの意味をよく理解した上で、ひとつひとつJSONのキーと、XMLの要素(と属性)の対応づけを行っていくしかないのではないでしょうか。キーや要素の名前も手がかりにはなると思いますが、同じ意味内容のデータが必ずJSONとXMLで同じ名前である保証もないですし。対応づけを行った結果として初めて、JSONでのこのキーが、XMLではtweet要素のid属性になるのだなあと分かるのだと思います。機械的に判断できるものでもないし、勝手に決めていいものでもないと思います。
ご質問の意図と違う回答でしたら申し訳ありません。
ちなみにXMLにおいてあるデータを要素にするか属性にするかに決まった答えがあるわけではありません。それはそのXMLのデータ構造を設計した者が決めます。属性を必ず使わないといけないわけでもありません。
ご回答ありがとうございます。Jsonファイルだけ与えられてそこからDTDやxml文書を作成する必要がありました。質問の背景を細かく説明することができず申し訳ありません。xmlにおいて要素にするか属性にするかは、設計者がきめるということで、なにか規則があるわけではないこと理解しました。ありがとうございます。
なるほど、分かりました。こちらこそ失礼しました。
私は自分でXMLスキーマの設計をした経験はないので、受け売りの知識をご紹介することしかできないのですが、『XML教科書』(朝倉浩志他著、ソフト・リサーチ・センター、2002年)という本の第4章「XMLの設計」の中に、要素と属性の使い分けに触れた箇所があります。以下に内容をまとめてみます。
・使い分けに明解な解答はない
・要素と属性それぞれの特徴に基づいて使い分ける
・要素の特徴
- 同名の要素を兄弟に持つことができる
- 内容に構造を持つことができる
- 兄弟要素間の出現順に意味を持たせられる
・属性の特徴
- 1つの要素は同名の属性を複数持つことができない
- 値に構造を持つことができない
- 開始タグ内での出現順に意味がない
- 属性固有のデータ型を持つ
- 要素に対して従属的な属性とそうでない属性がある
- DTDによるデフォルト値を持つことができる
・データ系XMLの場合は基本的にすべてを要素で表現する
・データ系XMLではプログラムでの利用のしやすさを第一に考える
・データ系XMLで属性が必要になるのは次のような特殊な場合のみ
- xml:lang属性やxml:space属性、名前空間宣言など、XMLの仕様に含まれる属性を使用するとき
- 要素のインスタンスへのアクセスや参照を容易にするために、要素にIDを振るとき。これはあくまでも要素のIDであり、データに含まれるIDではない。従業員のIDが従業員番号であるからといって、従業員番号を従業員要素の属性とする必要はない
- 要素自身に強く従属している値を表現したいとき。例えば、実装上の理由から、本来は必要ないがアプリケーションがデータを処理する際に必要になる情報を、要素に待たせなければならない場合
・文書系XMLの場合も基本的に属性を使う必要性はほとんどない
・例外は以下の場合
- 表示させたくない情報を属性とするとき。CSSを用いてXMLを表示させる際に、デフォルトでは属性はブラウザ上に表示されない
- データ系XMLと同様に、要素自体にIDを持たせたいとき
- マークアップ対象の文書に表示されている文字列は要素内容とし、それ以外の情報は属性とする、という古くからある慣習に従うとき
以上です。実際に実務の現場でどう判断され、どう実装されているかは判らないのですが…。少しでも参考になれば幸いです。
とてもわかりやすにご説明頂きありがとうございました。ベストアンサーとさせて頂きたいのですが、回答欄に再度記載いただくことは可能でしょうか。よろしくお願い致します。
回答欄に記載しました。
回答2件
あなたの回答
tips
プレビュー