Hangisini seçmelisiniz: XML niteliği veya Alt düğüm?


15

Veri tabanımızdaki bazı verileri XML olarak dışa aktarmak istiyoruz. Örneğin, bir Personolabilir age, nameve diğer bazı özellikleri.

XML biçimini tanımlamak için iki seçeneğimiz var.

Seçim # 1:

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

Seçim # 2:

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

Peki, alt düğüm veya öznitelik tanımı arasındaki fark nedir? Her seçimin yararı nedir?



2
Bu, 2008'de Stack Overflow'da sorulmuş olsa da , bu bir tasarım kararı gibi görünüyor ve burada konuya bağlı.
Thomas Owens

Yanıtlar:


9

Bunun için açık bir dokümantasyon / en iyi uygulama yoktur, ancak alternatifleri göz önünde bulundurun:

Öğe metni olarak:

  • verileri, biçimlendirme veya meta veriler yerine metin içeriğinin metin olarak kabul edildiği xhtml, vb. olarak görüntülemek daha kolay olabilir.
  • birden fazla olabilir. Birden çok yaş veya ad satırı olan alt içeriğe ihtiyacınız varsa, özellikler buna izin vermez
  • satır düzeyinde meta verilere ihtiyacınız varsa, bu amaç için <name>veya <age>bu amaçla nitelikleri kullanma seçeneğiniz vardır

Nitelikler olarak:

  • XML daha kompakt
  • XSLT ve DocTypes belirtmek daha basit
  • boşluk (dolgu, girinti, satır sonları) veya PCDATA alanlarına eklenebilecek diğer öğeler (yorumlar, PI'ler) (öğe metni) hakkında endişelenmenize gerek yoktur
  • sadece bir tane olabilir! birden çok ageözellik içeren alt içerik konusunda endişelenmenize gerek yoktur .

XML ile çalışmak için çok zaman harcadım ve bence saf veri iletişimi için özellikler mümkün olduğunda kullanılmalıdır. XML'in sunum için kullanılması muhtemelse (XSLT, xhtml vb.) Metin içeriği olarak daha iyi olabilir (ancak zorunlu değildir).


2
Hiçbir şeye değmez: XSLT kullanacaksanız, özellikleri kullanmamanız için hiçbir neden yoktur. Belki bazı XML + CSS şey yapacaksanız ya da başka birinin
XSLT'sini kullanacaksanız

İyi cevabınızı biraz daha dengeli hale getirmek için bazı noktalar ekledim, umarım bu konuyu geliştirir.
Doc Brown

9

XML tasarımının ilkeleri: IBM'den Uche Ogbuji'nin öğelerine karşı özniteliklere karşı ne zaman kullanılacağı muhtemelen bu konuda en iyi kaynaklardan biridir.

Kararın temelinde, niteliklerin 'tamamlanmış' şeyler olduğudur. Onları değiştiremez, değiştiremez veya iç içe geçiremezsiniz. Bunlar siparişten bağımsız ve element içinde farklıdır (aynı şeyden ikisine sahip olamazsınız).

Bu kısıtlamalardan herhangi biri değişebilecek şeylerse, verileri XML'in alt düğümü yapın.

Örneğinizde, adı ve yaşı olan bir kişiniz var. İlk, orta ve soyadım var ... ve bir takma adım var. Ve bazı insanların kızlık soyadları, birden fazla ikinci adı veya onurları var - John Ronald Reuel Tolkien'e böyle bir yapıya nasıl koyacaksınız ?

Ve böylece, onlara emri olan iki göbek adı olan birine sahibiz. Bu açıkça hayır, bir özniteliğin bunun için en iyi seçenek olmadığını göstermelidir.

Şu anda bulamıyorum, ancak yukarıdaki bağlantılı belgede, isimlerin, "İnsanların adlarının gelecekteki bir makalede biçimlendirmedeki muamelesini genişletmeyi umuyorum" ile sonuçlanan bir düşünce gerektiren şeyler olduğuna dair bir ifade var. Herhangi birinin bu konuda bir ipucu varsa, lütfen bir yorum bırakın veya bu noktada düzenleyin.

Öte yandan, yaş oldukça sabit bir yapıya sahip bir şeydir (bir tamsayı yerine doğum gününü öneririm). Bu nedenle, bu bilgiyi iyi bilinen ve anlaşılan bir formatta temsil etmek bir nitelikte mantıklıdır. Bir kişinin sadece bir doğum günü vardır ve korumak istediğiniz 'sipariş' yoktur.

Uche Ogbuji düzgün bir xml formatı tasarımında üç temel prensibi tanımlar. Aşağıdakiler, yukarıdaki bağlantılı belgenin kısaltılmış alıntılarıdır.

  • Yapısal bilgi ilkesi
    Eğer bilgiler yapılandırılmış bir biçimde ifade edilirse, özellikle yapı genişletilebilirse, elemanlar kullanın. Öte yandan: Bilgiler bir atomik belirteç olarak ifade edilirse, öznitelikleri kullanın
  • Okunabilirlik ilkesi
    Bilginin bir kişi tarafından okunması ve anlaşılması amaçlanıyorsa, öğeleri kullanın. Bilgiler bir makine tarafından en kolay anlaşılır ve sindirilirse, öznitelikleri kullanın.
  • Öğe / nitelik bağlama ilkesi
    Değerinin başka bir özellik tarafından değiştirilmesini istiyorsanız bir öğe kullanın

Ve böylece, isimler elementler olmalıdır - bunlar atomik bir jeton olmayan yapılandırılmış verilerdir, bir insan tarafından bir bilgisayardan daha çok okunmaları muhtemeldir ve ismin kendisinde başka bir özellik tarafından değiştirilebilirler.

Tarihler öznitelikler olmalıdır - bunlar bir atomik belirteç olan verilerdir, bir bilgisayar tarafından bir insandan daha fazla okunurlar (ve daha sonra gerekirse insanın tercih edilen biçimine dönüştürülürler ) ve son olarak başkaları tarafından değiştirilme olasılığı düşüktür. özellikleri.


2

Beyong rolfl'inkinden bir diğer husus alan sayısıdır.
Az sayıda nitelik bir karışıklık haline gelir ve okunması zor olur (bu, xml'nizin insan tarafından okunabilir olmasını istediğinizi varsayar, ancak bir programcı olarak bunu en azından test etmek için yapmak isteyeceksiniz).

Ayrıca, alanlardan birinin veri yapısının zaman içinde değişmesini bekliyorsanız, bunu bir özellik yapmayın.
Örneğin, ad alanınız. Belki gelecekte bu

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

Böyle bir şeyin olmasını bekliyorsanız, bir özellik haline getirmek daha sonra kodu yeniden düzenlemek anlamına gelir.


bu iyi nokta için teşekkürler. Ve neden "öznitelik yapmak daha sonra yeniden düzenleme kodu anlamına gelir"?
ZijingWu

2

Kişiler etiketi için, daha fazla Kişi etiketine sahip olmak normaldir, mantıklıdır, Kişiler listesinin nitelikleri değil bazı varlıkları vardır.

Hikaye Kişi ve bileşenleri için farklıdır. Bir Kişi bir ad içermiyor, ad Kişinin bir özelliğidir, bu yüzden yeni etiketler yerine niteliklere sadık kalırım. Etiketler, Adresler gibi tekrar eden şeyleriniz olduğunda kullanışlıdır, bunu özelliklerle yapamazsınız.

HTML bağlamında düşünürsek, değere sahip bir ad etiketi içeren bir girdiniz yok, değil mi?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.