Yang mana yang harus dipilih: Atribut XML atau Sub node?

15

Kami ingin mengekspor beberapa data dari basis data kami sebagai XML. Misalnya, Persondapat memiliki age, namedan beberapa properti lainnya.

Kami memiliki dua pilihan untuk menentukan format XML.

Pilihan # 1:

<Persons>
   <Person>
       <Age>16</Age>
       <Name>Richard</Name>
   </Person>
   <Person>
       <Age>34</Age>
       <Name>Eric</Name>
   </Person>
   ...
</Persons>

Pilihan # 2:

<Persons>
   <Person Age="16" Name="Richard"/>
   <Person Age="34" Name="Eric"/>
   ...
</Persons>

Jadi apa perbedaan antara definisi sub node atau atribut? Dan apa manfaat dari setiap pilihan?

ZijingWu
sumber
2
Ini adalah duplikat dari stackoverflow.com/questions/152313/xml-attributes-vs-elements
Pierre Arlaud
2
Meskipun ini ditanya tentang Stack Overflow pada tahun 2008 , ini tampaknya menjadi keputusan desain dan menjadi topik utama di sini.
Thomas Owens

Jawaban:

9

Tidak ada dokumentasi yang jelas / praktik terbaik untuk ini, tetapi pertimbangkan alternatifnya, seperti yang Anda miliki:

Sebagai teks Elemen:

  • bisa lebih mudah untuk menampilkan data sebagai xhtml, dll, di mana konten teks dianggap sebagai teks, daripada markup atau meta-data.
  • mungkin ada lebih dari satu. Jika Anda memerlukan konten anak dengan berbagai usia atau baris nama, atribut tidak akan mengizinkan ini
  • jika Anda memerlukan data meta tingkat baris, Anda memiliki opsi untuk menggunakan atribut <name>atau <age>untuk tujuan ini

Sebagai Atribut:

  • XML lebih kompak
  • XSLT dan DocTypes lebih mudah ditentukan
  • Anda tidak perlu khawatir tentang spasi putih (bantalan, indentasi, jeda baris), atau item lain yang dapat diperkenalkan (komentar, PI) di area PCDATA (teks elemen)
  • hanya ada satu! Anda tidak perlu khawatir tentang konten anak yang mengandung banyak ageatribut.

Saya telah menghabiskan banyak waktu bekerja dengan XML, dan, menurut pendapat saya, untuk komunikasi data murni, atribut harus digunakan kapan saja memungkinkan. Jika XML kemungkinan digunakan untuk presentasi (XSLT, xhtml, dll.) Maka mungkin lebih baik sebagai konten teks (tetapi tidak harus).

rolfl
sumber
2
Tidak ada nilainya: jika Anda akan menggunakan XSLT, secara harfiah tidak ada alasan untuk TIDAK menggunakan atribut. Mungkin jika Anda akan melakukan beberapa hal XML + CSS, atau Anda akan menggunakan XSLT orang lain ...
DougM
Saya menambahkan beberapa poin untuk membuat jawaban baik Anda sedikit lebih seimbang, harap Anda setuju bahwa ini meningkatkannya.
Doc Brown
9

Prinsip-prinsip desain XML: Kapan menggunakan elemen versus atribut oleh Uche Ogbuji dari IBM mungkin merupakan salah satu sumber daya terbaik tentang masalah ini.

Inti dari keputusan adalah bahwa atribut adalah hal-hal yang 'dilakukan'. Anda tidak dapat mengubahnya atau memodifikasinya atau membuat sarangnya. Mereka teratur dan berbeda dalam elemen (Anda tidak dapat memiliki dua hal yang sama).

Jika ada dari kendala ini adalah hal-hal yang dapat berubah, jadikan data simpul anak dari XML.

Dalam contoh Anda, Anda memiliki seseorang yang memiliki nama dan usia. Saya memiliki nama depan, tengah, dan belakang ... dan nama panggilan. Dan beberapa orang memiliki nama gadis, banyak nama tengah, atau kehormatan - bagaimana Anda memasukkan John Ronald Reuel Tolkien ke dalam struktur seperti itu?

Dan jadi kami memiliki seseorang yang memiliki dua nama tengah yang memesannya. Ini harus jelas menunjukkan bahwa tidak, atribut bukan pilihan terbaik untuk ini.

Saya tidak dapat menemukannya saat ini, tetapi dalam dokumen tertaut di atas ada pernyataan bahwa nama adalah hal-hal yang memerlukan sedikit pemikiran yang mengarah ke "Saya berharap untuk memperluas pada perlakuan nama-nama orang dalam markup di artikel mendatang." Jika ada yang memiliki petunjuk tentang ini, silakan tinggalkan komentar atau edit di tempat ini.

Di sisi lain, usia adalah sesuatu yang memiliki struktur yang agak tetap (saya sarankan ulang tahun daripada bilangan bulat). Dengan demikian, merepresentasikan informasi ini dalam format yang terkenal dan dipahami masuk akal dalam suatu atribut. Seseorang memiliki satu, dan hanya satu ulang tahun dan tidak ada 'pemesanan' untuk itu yang ingin Anda pertahankan.

Uche Ogbuji mengidentifikasi tiga prinsip inti dalam mendesain format xml dengan benar. Berikut ini adalah kutipan singkat dari dokumen tertaut di atas.

  • Prinsip informasi terstruktur
    Jika informasi diekspresikan dalam bentuk terstruktur, terutama jika struktur dapat diperpanjang, gunakan elemen. Di sisi lain: Jika informasi tersebut dinyatakan sebagai token atom, gunakan atribut
  • Prinsip keterbacaan
    Jika informasi dimaksudkan untuk dibaca dan dipahami oleh seseorang, gunakan elemen. Jika informasi paling mudah dipahami dan dicerna oleh mesin, gunakan atribut.
  • Prinsip mengikat elemen / atribut
    Gunakan elemen jika Anda perlu nilainya dimodifikasi oleh atribut lain

Jadi, nama harus elemen - mereka adalah data terstruktur yang bukan token atomik, mereka lebih cenderung dibaca oleh manusia daripada komputer dan mereka dapat dimodifikasi oleh atribut lain pada nama itu sendiri.

Tanggal harus menjadi atribut - mereka adalah data yang merupakan token atom, mereka lebih cenderung dibaca oleh komputer daripada manusia (dan kemudian diubah menjadi format yang disukai manusia jika perlu ), dan terakhir mereka tidak mungkin dimodifikasi oleh yang lain. atribut pada mereka.


sumber
2

Pertimbangan lain yang dimiliki beyong rolfl adalah jumlah bidang.
Lebih dari sejumlah kecil atribut menjadi berantakan, dan sulit dibaca (itu dengan asumsi Anda ingin xml Anda dapat dibaca manusia, tetapi sebagai seorang programmer Anda ingin melakukan itu untuk menguji setidaknya).

Juga, jika Anda mengharapkan struktur data salah satu bidang berubah seiring waktu, jangan menjadikannya atribut.
Misalnya, bidang nama Anda. Mungkin di masa depan ini akan menjadi

<name>
  <firstName>George</firstName>
  <lastName>Orwell</lastName>
  <maidenName></maidenName>
  <nickName>Robert</nickName>
</name>

Jika Anda mengharapkan sesuatu seperti itu terjadi, menjadikannya atribut akan berarti lebih banyak kode refactoring nanti.

jwenting
sumber
terima kasih untuk poin bagus ini. Dan mengapa "menjadikannya atribut berarti lebih banyak kode refactoring nanti"?
ZijingWu
2

Untuk tag Orang, adalah normal untuk memiliki lebih banyak tag Orang, masuk akal, daftar Orang memiliki beberapa entitas, bukan atribut.

Kisahnya berbeda untuk Orang dan komponennya. Seseorang tidak mengandung nama, nama tersebut adalah atribut dari Orang tersebut, jadi saya akan tetap menggunakan atribut alih-alih tag baru. Tag berguna ketika Anda memiliki hal-hal yang berulang seperti Alamat, Anda tidak dapat melakukannya dengan atribut.

Jika kami berpikir dalam konteks HTML, Anda tidak memiliki input dengan tag nama dengan nilai, bukan?

Silviu Burcea
sumber