W3SchoolsのXML属性 について学んでいます。
著者は次のことに言及しています(強調鉱山):
XML要素と属性
<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
<person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person>
最初の例では、性別が属性です。最後に、性は要素です。どちらの例も同じ情報を提供します。
属性を使用するタイミングと要素を使用するタイミングに関するルールはありません。 HTMLでは属性が便利です。 XMLでは、それらを避けることをお勧めします。代わりに要素を使用してください。
XML属性を避けますか?
属性の使用に関する問題の一部は次のとおりです。
- 属性に複数の値を含めることはできません(要素に含めることができます)
- 属性にはツリー構造を含めることはできません(要素には含めることができます)
- 属性は簡単に拡張できません(将来の変更のため)
属性の読み取りと保守は困難です。データに要素を使用します。データに関係のない情報の属性を使用します。
著者の見解は有名なものですか、それともXMLのベストプラクティスですか?
XMLの属性は避けるべきですか?
W3Schoolsは次のことも言及しました(強調鉱山):
メタデータのXML属性
ID参照が要素に割り当てられる場合があります。これらのIDは、HTMLのID属性とほぼ同じ方法でXML要素を識別するために使用できます。この例はこれを示しています。
<messages> <note id="501"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> <note id="502"> <to>Jani</to> <from>Tove</from> <heading>Re: Reminder</heading> <body>I will not</body> </note> </messages>
上記のIDは、異なるノートを識別するための単なる識別子です。ノート自体の一部ではありません。
ここで言いたいのは、メタデータ(データに関するデータ)は属性として保存されるべきであり、データ自体は要素として保存されるべきだということです
通常、属性または要素の使用法は、モデル化しようとしているデータによって決まります。
たとえば、特定のエンティティがデータの[〜#〜] part [〜#〜]である場合、それを要素にすることをお勧めします。たとえば、従業員の名前は従業員データの重要な部分です。
ここで[〜#〜] metadata [〜#〜]データ(データに関する追加情報を提供するもの)について伝えたいが、実際にはデータの一部ではない場合は、それを属性にします。たとえば、各従業員がバックエンド処理に必要なGUIDを持ち、それを属性にする方が良いとしましょう。しかし、他の目的には必要かもしれません)
何かが属性または要素であるべきだというルールはありません。
属性をすべてのコストで回避する必要はありません。要素よりもモデル化が簡単な場合があります。それはあなたが表現しようとしているデータに本当に依存しています。
OPから5年後の0.02は正反対です。説明させてください。
別の方法を考えた:
たとえば、本と主要なキャラクターの単純なコレクションを見ると、タイトルには「子供」はいません。これは単純な要素です。すべてのキャラクターには名前と年齢があります。
<book title='Hitchhiker's Guide to the Galaxy' author='Douglas Adams'>
<character name='Zaphod Beeblebrox' age='100'/>
<character name='Arthur Dent' age='42'/>
<character name='Ford Prefect' age='182'/>
</book>
<book title='On the Road' author='Jack Kerouac'>
<character name='Dean Moriarty' age='30'/>
<character name='Old Bull Lee' age='42'/>
<character name='Sal Paradise' age='42'/>
</book>
本には複数の著者がいる可能性があると主張できます。 OK、新しいauthor要素を追加して展開します(オプションで元の@authorを削除します)。確かに、元の構造は壊れていますが、実際には非常にまれであり、簡単に回避できます。単一の著者を想定した元のXMLのコンシューマーは、いずれにしても変更する必要があります(おそらく、著者を「book」テーブルの列から「author」テーブルに移動するためにDBを変更します)。
<book title='Hitchhiker's Guide to the Galaxy'>
<author name='Douglas Adams'/>
<author name='Some Other Guy'/>
<character name='Zaphod Beeblebrox' age='100'/>
<character name='Arthur Dent' age='42'>
<character name='Ford Prefect' age='182'/>
</book>
特に重要なことは、属性に物事を入れると、冗長なXMLが少なくなることです。
比較する
<person name="John" age="23" sex="m"/>
に対して
<person>
<name>
John
</name>
<age>
<years>
23
</years>
</age>
<sex>
m
</sex>
</person>
はい、それは少し偏見と誇張でしたが、あなたはポイントを得る
Googleを使用して正確な質問を検索しました。最初にこの記事 http://www.ibm.com/developerworks/library/x-eleatt/index.html に行きました。しかし、単純な質問自体には長すぎると感じました。とにかく、私はこのトピックに関するすべての回答を読みましたが、満足のいく要約が見つかりませんでした。そのため、後者の記事に戻りました。概要は次のとおりです。
要素を使用するのはいつですか、情報のビットを提示するために属性を使用するのはいつですか?
コアコンテンツの原理
問題の情報がXMLで表現または伝達されている重要な資料の一部であると考える場合は、それを要素に入れてください。情報が主要な通信の周辺的または付随的であると考えられる場合、またはアプリケーションが主要な通信を処理するのを純粋に意図している場合は、属性を使用します。
構造化情報の原理
情報が構造化された形式で表現されている場合、特に構造が拡張可能な場合は、要素を使用します。情報がアトミックトークンとして表現される場合、属性を使用します。
読みやすさの原理
情報を読んで理解することを目的としている場合は、要素を使用します。情報がマシンによって最も容易に理解され、消化される場合、属性を使用します。
要素/属性バインディングの原理
別の属性によって値を変更する必要がある場合は、要素を使用します。 [..]ほとんどの場合、ある属性に別の属性を変更させるのは恐ろしい考えです。
これは、この記事の重要な部分の短い要約です。すべてのケースの例と完全な説明を参照する場合は、元の記事を参照してください。
属性モデルのマッピング。要素の属性セットは、値がテキストまたはシリアル化可能な値の型である名前/値マップに直接同形化します。たとえば、C#では、任意のDictionary<string, string>
オブジェクトをXML属性リストとして表すことができ、その逆も可能です。
これは、要素の場合には特に当てはまりません。名前/値マップはいつでも要素のセットに変換できますが、逆はそうではありません。例:
<map>
<key1>value</key1>
<key1>another value</key1>
<key2>a third value</key2>
</map>
これをマップに変換すると、2つのことが失われます。key1
に関連付けられた複数の値と、key1
の前にkey2
が表示されるという事実です。
このような形式で情報を更新するために使用されるDOMコードを見ると、これの重要性がより明確になります。たとえば、次のように書くのは簡単です。
foreach (string key in map.Keys)
{
mapElement.SetAttribute(key, map[key]);
}
そのコードは簡潔で明確です。対照的に、言う:
foreach (string key in map.Keys)
{
keyElement = mapElement.SelectSingleNode(key);
if (keyElement == null)
{
keyElement = mapElement.OwnerDocument.CreateElement(key);
mapElement.AppendChild(keyElement);
}
keyElement.InnerText = value;
}
属性にCDATAを入れることはできません。私の経験では、遅かれ早かれ一重引用符、二重引用符、および/またはXML文書全体を「メンバー」に入れたいと思うでしょう。それが属性であれば、代わりに属性を使用した人に呪いをかけます要素の。
注:XMLでの私の経験は、主に他の人々のクリーンアップに関係していました。これらの人々は、「XMLは暴力のようなものです。XMLを使用しても問題が解決しない場合は、十分に使用していない」という古い格言に従っているようです。
これは、属性がデータに関するデータである例です。
データベースは、ID属性によって名前が付けられます。
データベースの「タイプ」属性は、データベースタグ内で検出されると予想されるものを示します。
<databases>
<database id='human_resources' type='mysql'>
<Host>localhost</Host>
<user>usrhr</user>
<pass>jobby</pass>
<name>consol_hr</name>
</database>
<database id='products' type='my_bespoke'>
<filename>/home/anthony/products.adb</filename>
</database>
</databases>
それはすべて、XMLの用途に依存します。ほとんどがソフトウェアとマシンの間の相互運用-Webサービスなど、一貫性のためだけにすべての要素を使用する方が簡単です(また、一部のフレームワークは、WCFなど)それが人間の消費を対象としている場合-すなわち、主に人々によって作成および/または読む-そして、属性の賢明な使用は、読みやすさをかなり改善することができます; XHTMLはその合理的な例であり、XSLTとXMLスキーマでもあります。
私は通常、属性がメタデータ-つまり、データに関するデータであることに基づいて作業します。避けるべきことの1つは、属性にリストを入れることです。例えば.
attribute="1 2 3 7 20"
それ以外の場合は、各要素を抽出するための追加レベルの解析があります。 XMLがリストの構造とツールを提供する場合、なぜ別のものを自分で課すのか。
属性を優先してコーディングしたいシナリオの1つは、SAXパーサーによる処理速度です。 SAXパーサーを使用すると、要素名と属性のリストを含む要素コールバックを取得できます。代わりに複数の要素を使用していた場合、複数のコールバックを取得します(各要素に1つ)。これがどれだけの負担/時間を費やすかはもちろん議論の余地がありますが、おそらく検討する価値があります。
作成者のポイントは正しいです(ただし、属性に値のリストが含まれる場合があります)。問題は、彼のポイントを気にするかどうかです。
それはあなた次第です。
W3schoolsを避ける必要があるのは、そのようなゴミのためです。どちらかといえば、それは彼らがJavaScriptについて持っているぞっとするようなものよりもさらに悪いことです。
一般的なルールとして、コンテンツ(つまり、エンドユーザーが消費することが予想されるデータ(人間の読書であろうと、処理のための情報を受け取るマシンであろうと))は、要素内に含めるのが最適です。メタデータ(たとえば、コンテンツに関連付けられているが、エンドユーザーへの表示ではなく内部使用にのみ価値があるID)は、属性に含める必要があります。
おそらくセマンティックな方法で問題を見ることができます。
データが要素とより緊密にリンクされている場合、それは属性になります。
すなわち、要素のID、私はそれを要素の属性として置くでしょう。
しかし、ドキュメントの属性を解析する際に、要素よりも頭痛の種になる可能性があるのは事実です。
すべてはあなたとスキーマの設計方法に依存します。
XMLフォーマットを決定する際に注意すべきもう1つの点があります。正しく思い出すと、「id」属性の値はすべて数値ではなく、XMLの名前のルールを満たしている必要があります。そしてもちろん、値は一意でなければなりません。これらの要件を満たさないファイルを処理する必要があるプロジェクトがありますが(他の点ではクリーンなXMLです)、ファイルの処理がより複雑になりました。