Di tempat kerja kami diminta untuk membuat file XML untuk meneruskan data ke aplikasi offline lain yang kemudian akan membuat file XML kedua untuk dilewati agar dapat memperbarui beberapa data kami. Selama proses kami telah berdiskusi dengan tim aplikasi lain tentang struktur file XML.
Sampel yang saya buat pada dasarnya adalah sesuatu seperti:
<INVENTORY>
<ITEM serialNumber="something" location="something" barcode="something">
<TYPE modelNumber="something" vendor="something"/>
</ITEM>
</INVENTORY>
Tim lain mengatakan bahwa ini bukan standar industri dan bahwa atribut hanya boleh digunakan untuk data meta. Mereka menyarankan:
<INVENTORY>
<ITEM>
<SERIALNUMBER>something</SERIALNUMBER>
<LOCATION>something</LOCATION>
<BARCODE>something</BARCODE>
<TYPE>
<MODELNUMBER>something</MODELNUMBER>
<VENDOR>something</VENDOR>
</TYPE>
</ITEM>
</INVENTORY>
Alasan saya menyarankan yang pertama adalah bahwa ukuran file yang dibuat jauh lebih kecil. Akan ada sekitar 80000 item yang akan ada dalam file selama transfer. Saran mereka pada kenyataannya ternyata tiga kali lebih besar dari yang saya sarankan. Saya mencari "Standar Industri" misterius yang disebutkan, tetapi yang paling dekat yang bisa saya temukan adalah bahwa atribut XML hanya boleh digunakan untuk data meta, tetapi mengatakan perdebatannya adalah tentang apa yang sebenarnya adalah data meta.
Setelah penjelasan panjang lebar (maaf) bagaimana Anda menentukan apa itu data meta, dan ketika merancang struktur dokumen XML bagaimana Anda harus memutuskan kapan harus menggunakan atribut atau elemen?
Jawaban:
Saya menggunakan aturan praktis ini:
Jadi milikmu sudah dekat. Saya akan melakukan sesuatu seperti:
EDIT : Diperbarui contoh asli berdasarkan umpan balik di bawah ini.
sumber
<
adalah<
, yang merupakan referensi karakter, bukan referensi entitas.<
tidak apa-apa dalam atribut. Lihat: w3.org/TR/REC-xml/#sec-predefined-ent]]>
!)Beberapa masalah dengan atribut adalah:
Jika Anda menggunakan atribut sebagai wadah untuk data, Anda berakhir dengan dokumen yang sulit dibaca dan dipelihara. Cobalah menggunakan elemen untuk menggambarkan data. Gunakan atribut hanya untuk memberikan informasi yang tidak relevan dengan data.
Jangan berakhir seperti ini (ini bukan bagaimana XML seharusnya digunakan):
Sumber: http://www.w3schools.com/xml/xml_dtd_el_vs_attr.asp
sumber
list
merupakan solusi parsial untuk masalah ini. Tidak boleh ada banyak atribut dengan nama yang sama. Denganlist
atribut masih hanya memiliki satu nilai, yaitu daftar yang dipisahkan spasi putih dari beberapa tipe data. Karakter pemisahan diperbaiki sehingga Anda tidak dapat memiliki beberapa nilai jika nilai tunggal dari tipe data yang diinginkan dapat berisi spasi. Ini mengesampingkan kemungkinan memiliki misalnya beberapa alamat dalam satu atribut "alamat"."XML" adalah singkatan dari "eXtensible Markup Language". Bahasa markup menyiratkan bahwa data adalah teks, ditandai dengan metadata tentang struktur atau pemformatan.
XHTML adalah contoh XML yang digunakan seperti yang dimaksudkan:
Di sini, perbedaan antara elemen dan atribut jelas. Elemen teks ditampilkan di browser, dan atribut adalah instruksi tentang cara menampilkannya (walaupun ada beberapa tag yang tidak berfungsi seperti itu).
Kebingungan muncul ketika XML digunakan bukan sebagai bahasa markup, tetapi sebagai bahasa serialisasi data , di mana perbedaan antara "data" dan "metadata" lebih kabur. Jadi pilihan antara elemen dan atribut lebih atau kurang sewenang-wenang kecuali untuk hal-hal yang tidak dapat diwakili dengan atribut (lihat jawaban feenster).
sumber
Elemen XML vs Atribut XML
XML adalah tentang kesepakatan. Pertama-tama tunda skema XML yang ada atau konvensi yang sudah mapan dalam komunitas atau industri Anda.
Jika Anda benar-benar dalam situasi untuk menentukan skema Anda dari bawah ke atas, berikut adalah beberapa pertimbangan umum yang harus menginformasikan keputusan elemen vs atribut :
sumber
Ini mungkin tergantung pada penggunaan Anda. XML yang digunakan untuk mewakili data terstruktur yang dihasilkan dari database dapat bekerja dengan baik dengan nilai bidang akhirnya ditempatkan sebagai atribut.
Namun XML yang digunakan sebagai transportasi pesan seringkali lebih baik menggunakan lebih banyak elemen.
Misalnya katakanlah kami memiliki XML ini seperti yang diusulkan dalam jawaban: -
Sekarang kami ingin mengirim elemen ITEM ke perangkat untuk mencetak barcode tetapi ada pilihan jenis penyandian. Bagaimana kami mewakili jenis penyandian yang diperlukan? Tiba-tiba kami menyadari, agak terlambat, bahwa barcode bukan nilai otomatis tunggal tetapi mungkin memenuhi syarat dengan pengkodean yang diperlukan saat dicetak.
Intinya adalah kecuali Anda membangun semacam XSD atau DTD bersama dengan namespace untuk memperbaiki struktur di atas batu, Anda mungkin lebih baik membiarkan opsi Anda terbuka.
IMO XML paling bermanfaat ketika dapat ditekuk tanpa melanggar kode yang ada menggunakannya.
sumber
Saya menggunakan pedoman berikut dalam desain skema saya sehubungan dengan atribut vs elemen:
Preferensi untuk atribut adalah menyediakan yang berikut ini:
Saya menambahkan ketika secara teknis mungkin karena ada saat-saat di mana penggunaan atribut tidak mungkin. Misalnya, atribut mengatur pilihan. Misalnya penggunaan (startDate dan endDate) xor (startTS dan endTS) tidak dimungkinkan dengan bahasa skema saat ini
Jika Skema XML mulai memungkinkan model konten "semua" dibatasi atau diperluas, maka saya mungkin akan membatalkannya
sumber
Saat ragu, KISS - mengapa mencampur atribut dan elemen saat Anda tidak memiliki alasan yang jelas untuk menggunakan atribut. Jika nanti Anda memutuskan untuk mendefinisikan XSD, itu juga akan menjadi lebih bersih. Kemudian jika Anda bahkan kemudian memutuskan untuk membuat struktur kelas dari XSD Anda, itu akan lebih sederhana juga.
sumber
Tidak ada jawaban universal untuk pertanyaan ini (saya sangat terlibat dalam pembuatan spesifikasi W3C). XML dapat digunakan untuk banyak tujuan - dokumen seperti teks, data, dan kode deklaratif adalah tiga yang paling umum. Saya juga banyak menggunakannya sebagai model data. Ada aspek aplikasi ini di mana atribut lebih umum dan yang lain di mana elemen anak lebih alami. Ada juga fitur dari berbagai alat yang membuatnya lebih mudah atau lebih sulit untuk menggunakannya.
XHTML adalah salah satu area di mana atribut memiliki kegunaan alami (misalnya di class = 'foo'). Atribut tidak memiliki urutan dan ini dapat memudahkan sebagian orang untuk mengembangkan alat. Atribut OTOH lebih sulit diketik tanpa skema. Saya juga menemukan atribut namespace (foo: bar = "zork") seringkali lebih sulit untuk dikelola di berbagai toolset. Tetapi lihat beberapa bahasa W3C untuk melihat campuran yang umum. SVG, XSLT, XSD, MathML adalah beberapa contoh bahasa terkenal dan semuanya memiliki banyak atribut dan elemen. Beberapa bahasa bahkan memungkinkan lebih dari satu cara untuk melakukannya, misalnya
atau
Perhatikan bahwa ini TIDAK setara secara sintaksis dan memerlukan dukungan eksplisit dalam alat pemrosesan)
Saran saya adalah untuk melihat praktik umum di area terdekat dengan aplikasi Anda dan juga mempertimbangkan perangkat apa yang mungkin ingin Anda terapkan.
Akhirnya pastikan Anda membedakan ruang nama dari atribut. Beberapa sistem XML (misalnya Linq) mewakili ruang nama sebagai atribut dalam API. IMO ini jelek dan berpotensi membingungkan.
sumber
Yang lain telah membahas bagaimana membedakan antara atribut dari elemen tetapi dari perspektif yang lebih umum menempatkan semuanya dalam atribut karena itu membuat XML yang dihasilkan lebih kecil salah.
XML tidak dirancang untuk menjadi ringkas tetapi untuk portabel dan dapat dibaca manusia. Jika Anda ingin mengurangi ukuran data dalam perjalanan, maka gunakan sesuatu yang lain (seperti buffer protokol Google ).
sumber
pertanyaan juta dolar!
pertama, jangan terlalu khawatir tentang kinerja sekarang. Anda akan kagum pada seberapa cepat parser xml yang dioptimalkan akan merobek xml Anda. yang lebih penting, apa desain Anda untuk masa depan: seiring XML berkembang, bagaimana Anda akan mempertahankan kopling yang longgar dan interoperabilitas?
lebih konkretnya, Anda dapat membuat model konten suatu elemen lebih kompleks tetapi lebih sulit untuk memperluas atribut.
sumber
Kedua metode untuk menyimpan properti objek sangat valid. Anda harus berangkat dari pertimbangan pragmatis. Coba jawab pertanyaan berikut:
Representasi mana yang menyebabkan parsing data \ generasi lebih cepat?
Representasi mana yang mengarah pada transfer data yang lebih cepat?
Apakah keterbacaan penting?
...
sumber
Gunakan elemen untuk data dan atribut untuk data meta (data tentang data elemen).
Jika suatu elemen ditampilkan sebagai predikat dalam string pilihan Anda, Anda memiliki pertanda baik bahwa itu harus menjadi atribut. Demikian juga jika suatu atribut tidak pernah digunakan sebagai predikat, maka mungkin itu bukan data meta yang berguna.
Ingat bahwa XML seharusnya dapat dibaca oleh mesin, tidak dapat dibaca oleh manusia dan untuk dokumen besar, XML dapat dikompres dengan baik.
sumber
Ini bisa diperdebatkan dengan cara lain, tetapi kolega Anda benar dalam arti bahwa XML harus digunakan untuk "markup" atau meta-data di sekitar data aktual. Untuk bagian Anda, Anda benar bahwa kadang-kadang sulit untuk memutuskan di mana garis antara meta-data dan data saat memodelkan domain Anda dalam XML. Dalam praktiknya, apa yang saya lakukan adalah berpura-pura bahwa segala sesuatu di markup disembunyikan, dan hanya data di luar markup yang dapat dibaca. Apakah dokumen tersebut masuk akal seperti itu?
XML terkenal besar. Untuk transportasi dan penyimpanan, kompresi sangat disarankan jika Anda mampu membeli daya pemrosesan. XML kompres dengan baik, kadang-kadang sangat baik, karena pengulangannya. Saya telah mengkompres file besar hingga kurang dari 5% dari ukuran aslinya.
Poin lain untuk meningkatkan posisi Anda adalah bahwa sementara tim lain berdebat tentang gaya (dalam sebagian besar alat XML akan menangani semua-atribut dokumen semudah dokumen all-# PCDATA), Anda memperdebatkan kepraktisan. Sementara gaya tidak dapat sepenuhnya diabaikan, kelebihan teknis seharusnya lebih berat.
sumber
Ini sebagian besar masalah preferensi. Saya menggunakan Elemen untuk pengelompokan dan atribut untuk data jika memungkinkan karena saya melihat ini lebih kompak daripada alternatifnya.
Misalnya saya lebih suka .....
...Dari pada....
Namun jika saya memiliki data yang tidak mewakili dengan mudah dalam katakanlah 20-30 karakter atau mengandung banyak kutipan atau karakter lain yang perlu melarikan diri maka saya akan mengatakan sudah waktunya untuk memecahkan elemen ... mungkin dengan blok CData.
sumber
Bagaimana kalau memanfaatkan intuisi orientasi objek yang kita peroleh dengan susah payah? Saya biasanya mendapati bahwa berpikir adalah objek dan yang merupakan atribut dari objek atau objek yang dimaksud.
Apa pun yang secara intuitif masuk akal sebagai objek akan cocok sebagai elemen. Atribut-atributnya (atau propertinya) akan menjadi atribut untuk elemen-elemen ini dalam xml atau elemen turunan dengan atribut.
Saya pikir untuk kasus-kasus yang lebih sederhana seperti pada contoh analogi orientasi objek bekerja dengan baik untuk mengetahui mana elemen dan yang merupakan atribut dari suatu elemen.
sumber
Hanya beberapa koreksi ke beberapa info buruk:
@John Ballinger: Atribut dapat berisi data karakter apa pun. <> & "'masing-masing harus lolos ke & lt; & gt; & amp; & quot; dan & apos ;. Jika Anda menggunakan pustaka XML, itu akan mengurusnya untuk Anda.
Sial, atribut dapat berisi data biner seperti gambar, jika Anda benar-benar mau, hanya dengan encoding base64 dan menjadikannya data: URL.
@feenster: Atribut dapat berisi beberapa item yang dipisahkan oleh spasi dalam kasus IDS atau NAMES, yang akan mencakup angka. Nitpicky, tapi ini bisa menghemat ruang.
Menggunakan atribut dapat membuat XML tetap kompetitif dengan JSON. Lihat Fat Markup: Memotong Mitos Markup Lemak satu kalori setiap kali .
sumber
Saya selalu terkejut dengan hasil diskusi semacam ini. Bagi saya ada aturan yang sangat sederhana untuk memutuskan apakah data termasuk dalam atribut atau sebagai konten dan apakah data tersebut memiliki sub-struktur yang dapat dinavigasi.
Jadi misalnya, teks non-markup selalu termasuk dalam atribut. Selalu.
Daftar termasuk dalam sub-struktur atau konten. Teks yang dari waktu ke waktu termasuk sub-konten terstruktur yang melekat termasuk dalam konten. (Menurut pengalaman saya, ini relatif sedikit - teks dengan markup - saat menggunakan XML untuk penyimpanan atau pertukaran data.)
Skema XML yang ditulis dengan cara ini ringkas.
Setiap kali saya melihat kasus seperti
<car><make>Ford</make><color>Red</color></car>
, saya berpikir pada diri sendiri, "Ya, apakah penulis berpikir bahwa akan ada sub-elemen dalam elemen make?"<car make="Ford" color="Red" />
secara signifikan lebih mudah dibaca, tidak ada pertanyaan tentang bagaimana ruang putih akan ditangani dll.Diberikan hanya aturan penanganan spasi putih, saya percaya ini adalah maksud yang jelas dari desainer XML.
sumber
Ini sangat jelas dalam HTML di mana perbedaan atribut dan markup dapat dilihat dengan jelas:
Jika Anda hanya memiliki data murni sebagai XML, ada perbedaan yang kurang jelas. Data bisa berdiri di antara markup atau sebagai atribut.
=> Sebagian besar data harus berdiri di antara markup.
Jika Anda ingin menggunakan atribut di sini: Anda dapat membagi data menjadi dua kategori: Data dan "data meta", di mana data meta bukan bagian dari catatan, Anda ingin menyajikan, tetapi hal-hal seperti "format versi", "tanggal dibuat" , dll.
Bisa juga dikatakan: "Gunakan atribut untuk menandai tag, gunakan tag untuk memberikan data itu sendiri."
sumber
Saya setuju dengan Feenster. Jauhi atribut jika Anda bisa. Elemen-elemennya ramah evolusi dan lebih dapat dioperasikan di antara toolkit layanan web. Anda tidak akan pernah menemukan toolkit ini menyambungkan pesan permintaan / respons Anda menggunakan atribut. Ini juga masuk akal karena pesan kami adalah data (bukan metadata) untuk toolkit layanan web.
sumber
Atribut dapat dengan mudah menjadi sulit dikelola seiring waktu, percayalah. Saya selalu menjauh dari mereka secara pribadi. Elemen jauh lebih eksplisit dan dapat dibaca / digunakan oleh pengurai dan pengguna.
Hanya waktu saya pernah menggunakannya adalah menentukan ekstensi file url aset:
Saya kira jika Anda tahu 100% atribut tidak perlu diperluas Anda bisa menggunakannya, tetapi berapa kali Anda tahu itu.
sumber