Boş XML öğelerini temsil etmenin doğru yolu nedir?


166

nullÇeşitli şekillerde temsil edilen öğeler gördüm :

Öğe şu şekilde bulunur xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

Öğe var, ancak boş bir öğe olarak temsil edildi (ki bu 'boş' beri yanlış olduğuna ve nullanlamsal olarak farklı olduğuna inanıyorum ):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

Öğe, döndürülen biçimlendirmede hiç mevcut değil :

 <book>
     <title>Beowulf</title>
 </book>

Öğenin bir <null/>alt öğesi vardır ( aşağıdaki TStamper'den ):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

Böyle bir nulldeğeri temsil etmenin doğru veya kanonik bir yolu var mı? Yukarıdaki örneklerden başka ek yollar var mı?

Yukarıdaki örneklerin XML'si anlaşılmıştır, bu yüzden çok fazla okumayın. :)

Yanıtlar:


121

xsi: nil, bir değeri temsil etmenin doğru yoludur, böylece DOM Level 2 çağrısı getElementValue () verildiğinde, NULL değeri döndürülür. xsi: nil, içerik türü normal olarak boş öğelere izin vermese bile, içeriği olmayan geçerli bir öğeyi belirtmek için de kullanılır.

Boş bir etiket kullanılırsa, getElementValue () boş dize ("") döndürür. Etiket atlanırsa, hiçbir yazar etiketi bile yoktur. Bu, anlamsal olarak 'nil' olarak ayarlanmasından farklı olabilir (Örn. "Series" i nil olarak ayarlamak, kitabın hiçbir diziye ait olmaması olabilirken, diziyi atlamak, serinin geçerli öğeye uygulanamaz bir öğe olduğu anlamına gelebilir.)

Gönderen: W3C

XML Şeması: Yapılar, boş içeriğe ihtiyaç duymayan hatta zorunlu olarak izin vermeyen bir içerik türüne rağmen, hiçbir içeriğe sahip olmadığında bir öğenin · geçerli olarak kabul edilmesi gerektiğini bildiren bir mekanizma sunar. Öğe, true değerine sahip xsi: nil özniteliğine sahipse, içerik olmadan geçerli olabilir. Bu şekilde etiketlenmiş bir öğe boş olmalıdır, ancak ilgili karmaşık tür tarafından izin veriliyorsa öznitelikler taşıyabilir.

Açıklama:
Bir kitap xml öğeniz varsa ve alt öğelerden biri kitap: serisiyse, doldururken birkaç seçeneğiniz vardır:

  1. Elemanı tamamen kaldırma - Bu, serinin bu kitap için geçerli olmadığını veya bu kitabın bir serinin parçası olmadığını belirtmek istediğinizde yapılabilir. Bu durumda, kitap: serilerle eşleşen bir şablona sahip xsl dönüşümleri (veya diğer olay tabanlı işlemciler) hiçbir zaman çağrılmaz. Örneğin, xsl'niz kitap öğesini tablo satırına (xhtml: tr) dönüştürürse, bu yöntemi kullanarak yanlış sayıda tablo hücresi (xhtml: td) alabilirsiniz.
  2. Elemanı boş bırakmak - Bu, serinin "" olduğunu veya bilinmediğini veya kitabın bir serinin parçası olmadığını gösterebilir. Kitap: serilerle eşleşen tüm xsl dönüşümleri (veya başka bir evernt tabanlı ayrıştırıcı) çağrılır. Current () değeri "" olacaktır. Bu yöntemi kullanarak bir sonraki tarif edilenle aynı sayıda xhtml: td etiketi alacaksınız.
  3. Xsi: nil = "true" kullanılması - Bu, yalnızca boş değil, kitap: seri öğesinin NULL olduğunu gösterir. Eşleşen bir kitap: serisi içeren xsl dönüşümünüz (veya başka bir olay tabanlı ayrıştırıcı) çağrılır. Current () değeri boş olacaktır (boş dize değil). Bu yöntem ve (2) arasındaki temel fark, book: serisinin şema türünün geçerli bir değer olarak boş dizeye ("") izin vermesine gerek olmamasıdır. Bu, bir dizi öğesi için gerçek bir anlam ifade etmez, ancak şemada numaralandırılmış tür olarak tanımlanan bir dil öğesi için xsi: nil = "true" öğenin veri içermemesine izin verir. Başka bir örnek, ondalık türündeki öğeler olabilir. Bunların boş olmasını istiyorsanız, yalnızca "" ve ondalık sayılara izin veren numaralandırılmış bir dizeyi birleştirebilir veya sıfırlanabilir bir ondalık sayı kullanabilirsiniz.

11
Xsi: nil kullanmak doğrudur, ancak doğru ad alanında olduğundan emin olmalısınız: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
STW

Aslında xmlns:xsi="http://w3.org/2001/XMLSchema-instance". Eksik http: // 'yi not edin. Bu önemlidir çünkü ad alanı dizesi aslında bir uri değil, yalnızca xml ayrıştırıcısına bir dizedir.
Burak Arslan

9
Heh, bunun hala biraz yanlış olduğuna inanıyorum. Olmalı xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". "Www." Bkz. W3.org/TR/xmlschema-1/#no-xsi
Janne Mattila

Cevabımda belirtildiği gibi, öğenin durumunun bir temsili değil, öğenin kullanımıyla ilgili bir kısıtlama olduğu için
yoruma katılmıyorum

2
@ChrisV: Doğru değil, xsi:önek bildirilmelidir. Ad alanına duyarlı bir XML ayrıştırıcısı, xsi:öneki bildirmeden kullanmaya çalışırsanız XML belgenizi reddeder . Burada ilgili spesifikasyon, önceden tanımlanmış tek öneklerin ve olduğunu belirten w3.org/TR/xml-names/#nsc-NSDeclared ("Ad alanı kısıtlaması: Önek Bildirildi") şeklindedir . XML Şeması, XML ad alanları spesifikasyonunun üzerine inşa edilir, ancak önceden tanımlanmış ek önekler eklemez, çünkü bunu yapmak aslında XML ad alanları spesifikasyonlarını ihlal eder. xml:xmlns:
Simon Kissane

9

Kanonik bir cevap yoktur, çünkü XML temelde sıfır kavramına sahip değildir. Ama Xml / Object mapping (nesne grafikleri null olduğundan beri) istediğinizi varsayalım; yani sizin için cevap "aletiniz ne kullanıyorsa". İşleme yazıyorsanız, bu ne istersen demektir. XML Şeması kullanan araçlar xsi:niliçin gitmek için bir yoldur. Çoğu haritacı için, eşleşen öğeyi / niteliği atlamak bunu yapmanın yoludur.


8

XML'inizi nasıl doğruladığınıza bağlıdır. XML Şeması doğrulamasını kullanırsanız, nulldeğerleri temsil etmenin doğru yolu xsi:nilözniteliktir.

[ Kaynak ]


7

W3 bağlantısındaki belgeler

http://www.w3.org/TR/REC-xml/#sec-starttags

bunun önerilen formlar olduğunu söylüyor.

<test></test>
<test/>

Diğer cevapta belirtilen özellik, devletin bir temsili değil, validasyon mekanizmasıdır. Lütfen http://www.w3.org/TR/xmlschema-1/#xsi_nil adresine bakın

XML Şeması: Yapılar , boş içeriğe ihtiyaç duymayan hatta zorunlu olarak izin vermeyen bir içerik türüne rağmen, hiçbir içeriğe sahip olmadığında bir öğenin · geçerli olarak kabul edilmesi gerektiğini bildiren bir mekanizma sunar . Öğe, true değerine sahip xsi: nil özniteliğine sahipse, içerik olmadan geçerli olabilir. Bu şekilde etiketlenmiş bir öğe boş olmalıdır , ancak ilgili karmaşık tür tarafından izin veriliyorsa öznitelikler taşıyabilir.

Bu cevabı açıklığa kavuşturmak için: İçerik

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>

7
Boş elemanlar için tavsiye budur ; boş === boş olduğu fikriniz var mı? Genellikle durumsal olmasına rağmen ikisi arasında bir fark olduğuna inanıyorum. Aynı olduklarını söylüyorsanız, cevabınızda bu argümandan bahsetmenizi tavsiye ederim.
Rob Hruska

1
Boş, null ile aynı değildir; öyleyse, bu yığın akışı sorusu asla sorulmazdı. Bu cevap yanlış. Ancak, programcı xml okuyacak mantığın eksik bir elemanı mı yoksa xsi: nil'i işlemek için mi hazırlandığını belirlemelidir; değilse, bu formlardan birini kullanmak gerekebilir; yani, boş / eksik eleman ile boş bir eleman arasındaki ayrımı kaybetmek gerekebilir.
ToolmakerSteve

@RHHruska evet, haklısın, boş bir elementin tanımı, ancak KitsuneYMG'nin işaret ettiği W3C tanımını göz önünde bulundurursak, elementin boş olması gerektiğini ve temsilin daha çok tanım olduğuna inanıyorum. sonra geçerli durumunu temsil etiket, bu yüzden bu cevap katılmıyorum ve boş bir boş öğenin en iyi temsil olduğuna inanıyorum. Fikir basittir, iyi bir yapıyı korumak için, tüm öğelerin temsil edilmesi gerekir, aksi takdirde varlığını bilmezsiniz ve bu nedenle onu yanlış tanıyabilirsiniz.
Oakcool

4

Sen kullanmak xsi:niliçin şema semantik bir eleman varsayılan bir değer olduğunu ve eleman yoksa varsayılan değer kullanılması gerektiğini olmadığı incelenmektedir. Önceki cümlenin kendiliğinden korkunç bir fikir olmadığı akıllı insanlar olduğunu varsaymalıyım, ancak bana dokuz çeşit kötü gibi geliyor. Şimdiye kadar birlikte çalıştığım her XML biçimi, öğeyi atlayarak boş değerleri temsil eder. (Veya özellik ve bir özelliği işaretleme konusunda iyi şanslar xsi:nil.)


Bir belge yayın uygulamasında, öğenin içeriği yoksa başlık sayfasındaki tarihin geçerli tarihe varsayılan olarak ayarlanmasını dateistiyorsanız, uygulamanın başlık sayfasında istediğiniz yeri bilmeyeceği için öğeyi tamamen atlamak çok yardımcı olmaz. görüntülenme tarihi. (Atlanan öğenin yalnızca bir olası konumu varsa, bu bir sorun değildir; gerçek belge sözcük dağarcığında neredeyse tüm öğelerin birçok olası konumu vardır.)
CM Sperberg-McQueen

4

Özniteliği veya öğeyi atlamak, daha az resmi verilerde işe yarar.

Daha karmaşık bilgilere ihtiyacınız varsa, GML şemaları nilReason niteliğini ekler, örneğin: GeoSciML'de :

  • xsi:nil "true" değerine sahip bir değer olmadığını belirtmek için kullanılır
  • nilReasoneksik değerler için ek bilgi kaydetmek için kullanılabilir; bu standart GML nedenlerinden biri ( missing, inapplicable, withheld, unknown) veya başında metin other:olabilir veya daha ayrıntılı bir açıklamaya URI bağlantısı olabilir.

Veri alışverişi yaparken, XML'in yaygın olarak kullanıldığı rol, bir alıcıya veya belirli bir amaç için gönderilen veriler, farklı kimlik doğrulaması ödeyen veya farklı bir kişi tarafından kullanılabilecek içerik gizlenebilir. İçeriğin neden eksik olduğunu bilmek çok önemli olabilir.

Bilim adamları ayrıca bilginin neden eksik olduğu konusunda da endişeli. Örneğin, kalite nedenleriyle düşürüldüyse, orijinal bozuk verileri görmek isteyebilirler.


2

Birçok durumda Null değerinin amacı, uygulamanızın önceki bir sürümünde bulunmayan bir veri değerine hizmet etmektir.

Yani "ReportMaster" sürüm 1 uygulamanızdan bir xml dosyanız olduğunu varsayalım.

Şimdi ReportMaster sürüm 2'de tanımlanabilecek veya tanımlanamayan bazı özellikler eklenmiştir.

'Etiket yok' null anlamına gelir 'temsilini kullanırsanız, ReportMaster 1 xml dosyanızı okumak için otomatik geriye dönük uyumluluk elde edersiniz.

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.