2009-04-21 9 views
139

I widać null elementy przedstawione na kilka sposobów:Jaki jest poprawny sposób reprezentowania pustych elementów XML?

element jest obecny z xsi:nil="true":

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

element jest obecny, ale przedstawiony jako element pusty (które zdaniem jest źle, ponieważ "pusty" i null są semantycznie różne):

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

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

element nie występuje w ogóle w zwróconym znaczników:

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

Element posiada element <null/> dziecko (od TStamper poniżej):

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

tam jest poprawna, lub kanoniczny sposób reprezentowania takiej wartości? Czy istnieją dodatkowe sposoby niż powyższe przykłady?

XML powyższych przykładów jest zmyślony, więc nie czytaj za daleko do niego. :)

Odpowiedz

98

xsi: zerowa jest poprawny sposób reprezentuje wartość taką, że: Gdy DOM Poziom 2 getElementValue połączenia() jest wystawiony wartość null jest zwracany. xsi: zero jest również używane do wskazania prawidłowego elementu bez zawartości, nawet jeśli ten typ zawartości elementu zwykle nie pozwala na puste elementy.

Jeśli użyto pustego znacznika, funkcja getElementValue() zwraca pusty ciąg znaków ("") Jeśli tag zostanie pominięty, oznacza to, że żaden tag autora nie występuje. Może to być semantycznie odmienne od ustawienia na "zero" (np. Ustawienie "Seria" do zera może oznaczać, że książka nie należy do serii, a pominięcie serii może oznaczać, że seria jest elementem, który nie ma zastosowania do bieżącego elementu.)

Od: The W3C

XML Schema: Struktury wprowadza mechanizm sygnalizacji że element powinny być przyjmowane jako · poprawny · gdy nie ma treści, mimo rodzaju zawartości, która nie wymaga ani nawet koniecznie zezwalaj na puste treści. Element może być · poprawny · bez zawartości , jeśli ma atrybut xsi: nil z wartością true. Tak oznaczony element musi być pusty, ale może przenosić atrybuty, jeśli zezwala na to odpowiedni typ złożony.

Wyjaśnienie:
Jeśli masz element książka XML i jeden z elementów dziecko jest książka: seria masz kilka opcji podczas wypełniania go:

  1. usunięcie elementu całości - można zrobić, gdy chcesz zaznaczyć, że seria nie ma zastosowania do tej książki lub że książka nie jest częścią serii. W tym przypadku xsl przekształca (lub inne procesory oparte na zdarzeniach), które mają szablon zgodny z książką: seria nigdy nie zostanie wywołana. Na przykład, jeśli twój xsl zamienia element książki na wiersz tabeli (xhtml: tr), możesz uzyskać niepoprawną liczbę komórek tabeli (xhtml: td) przy użyciu tej metody.
  2. Pozostawienie pustego elementu - może to oznaczać, że seria jest "" lub jest nieznana, lub że książka nie należy do serii. Zostanie wywołana dowolna transformacja xsl (lub inny parser oparty o evernt), który pasuje do książki: series. Wartością current() będzie "". Otrzymasz taką samą liczbę tagów xhtml: td, używając tej metody, jak przy następnym opisanym.
  3. Użycie xsi: nil = "true" - Oznacza to, że element book: series ma wartość NULL, a nie jest pusty. Zostanie wywołana Twoja transformata xsl (lub inny parser oparty na zdarzeniach), które mają książkę dopasowującą szablon: serial. Wartość current() będzie pusta (nie pusty ciąg). Główna różnica między tą metodą a (2) polega na tym, że typ książki: seria nie musi dopuszczać pustego ciągu ("") jako prawidłowej wartości. To nie ma sensu dla elementu serii, ale dla elementu języka, który jest zdefiniowany jako typ wyliczeniowy w schemacie, xsi: nil = "true" pozwala elementowi nie mieć danych. Innym przykładem mogą być elementy typu dziesiętnego. Jeśli chcesz, aby były puste, możesz połączyć wyliczony ciąg znaków, który zezwala tylko na "" i dziesiętny, lub użyj dziesiętnego, który można nullować.
+11

Korzystanie z xsi: nil jest poprawna, ale należy upewnić się, że znajduje się w odpowiedniej przestrzeni nazw: xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" – STW

+0

To właściwie 'xmlns: xsi =" ht tp: //w3.org/2001/XMLSchema-instance "'. Zwróć uwagę na brakujący http: //. Jest to ważne, ponieważ ciąg przestrzeni nazw jest właściwie ciągiem do parsera xml, a nie uri. –

+9

Heh, uważam, że nadal jest trochę nie tak. Powinien to być 'xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance "'. Uwaga "www.". Zobacz http://www.w3.org/TR/xmlschema-1/#no-xsi –

8

To zależy od sposobu sprawdzania poprawności kodu XML. Jeśli używasz sprawdzania schematu XML, poprawny sposób reprezentowania wartości null jest z atrybutem xsi:nil.

[Source]

2

W wielu przypadkach celem wartości Null jest podawanie wartości danych, której nie było w poprzedniej wersji aplikacji.

Więc powiedzmy, że masz plik xml z aplikacji „ReportMaster” Wersja 1.

Teraz w ReportMaster wersji 2 a kilka atrybutów, które zostały dodane, które mogą lub nie być zdefiniowane.

Jeśli użyjesz funkcji "brak tagu oznacza zerowy", otrzymasz automatyczną kompatybilność wsteczną do odczytu pliku xml raportu ReportMaster 1.

4

Używa się xsi:nil, gdy semantyka schematu wskazuje, że element ma wartość domyślną, i że należy użyć wartości domyślnej, jeśli element nie występuje. Muszę założyć, że są inteligentni ludzie, dla których poprzednie zdanie nie jest ewidentnie strasznym pomysłem, ale brzmi jak dziewięć rodzajów złego mnie. Każdy format XML, z jakim kiedykolwiek pracowałem, reprezentuje wartości puste, pomijając element. (Lub atrybut i powodzenia oznaczające atrybut z xsi:nil.)

+0

Jeśli w aplikacji do publikowania dokumentów chcesz, aby data na stronie tytułowej była domyślna do bieżącej daty, jeśli element nie zawiera treści, pominięcie elementu "date" w całości nie jest zbyt pomocne, ponieważ aplikacja nie będzie miała pojęcia, gdzie na stronie stronę tytułową, na której ma się pojawić data. (Jeśli pominięty element ma tylko jedną możliwą lokalizację, nie stanowi to problemu, w prawdziwym słownictwie dokumentu prawie wszystkie elementy mają wiele możliwych lokalizacji.) –

4

Po prostu pominięcie atrybutu lub elementu działa dobrze w mniej formalnych danych.

Jeśli potrzebujesz bardziej zaawansowane informacje, schematy GML dodać atrybut nilReason, np: w GeoSciML:

  • xsi:nil o wartości „prawda” jest używany do wskazania, że ​​żadna wartość nie jest dostępny
  • nilReason może służyć do rejestrowania dodatkowych informacji o brakujących wartościach; może to być jeden ze standardowych powodów GML (missing, inapplicable, withheld, unknown) lub tekst dodany przez other: lub może być linią URI do bardziej szczegółowego wyjaśnienia.

Podczas wymiany danych rola, dla której powszechnie używany jest język XML, dane przesyłane do jednego odbiorcy lub do określonego celu mogą zawierać treści ukryte, które byłyby dostępne dla kogoś, kto zapłacił lub posiadał inne uwierzytelnienie. Znajomość przyczyny braku treści może być bardzo ważna.

Naukowcy również obawiają się, dlaczego brakuje informacji. Na przykład, jeśli został usunięty ze względu na jakość, mogą chcieć zobaczyć oryginalne złe dane.

9

Nie ma odpowiedzi kanonicznej, ponieważ XML zasadniczo nie ma koncepcji zerowej. Ale zakładam, że chcesz mapowania Xml/Object (ponieważ wykresy obiektów mają wartości zerowe); więc odpowiedź brzmi "cokolwiek używa twoje narzędzie". Jeśli piszesz obsługę, oznacza to, co wolisz. W przypadku narzędzi korzystających ze schematu XML, jest to droga, którą należy przejść. Dla większości twórców map, pomijanie pasującego elementu/atrybutu jest sposobem na zrobienie tego.

5

Dokumentacja w linku w3

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

mówi, że to są recomended formy.

<test></test> 
<test/> 

Atrybut wymieniony w drugiej odpowiedzi jest mechanizmem walidacji, a nie reprezentacją stanu. Proszę odnieść się do schematu http://www.w3.org/TR/xmlschema-1/#xsi_nil

XML: Struktury wprowadza mechanizm sygnalizacji że element powinny być przyjmowane jako · poprawny · gdy nie ma treści, mimo rodzaju zawartości, która nie wymaga ani nawet niekoniecznie zezwól na pustą zawartość . Element może być · poprawny · bez zawartości, jeśli ma atrybut xsi: nil z wartością true. Element tak oznaczony musi być pusty, ale może przenosić atrybuty, jeśli jest to dozwolone przez odpowiedni typ kompleksu .

Aby wyjaśnić tę odpowiedź: zawartość

<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

To jest zalecenie dla * pustych * elementów; czy uważasz, że pusty === null? Uważam, że istnieje różnica między nimi, choć często sytuacyjna. Jeśli oświadczasz, że są one takie same, polecam wspomnieć o tym argumencie w Twojej odpowiedzi. –

+0

Pusty nie jest taki sam jak zerowy; gdyby tak było, to pytanie o stackoverflow nigdy nie byłoby zadawane. Ta odpowiedź jest błędna. Jednak programista powinien ustalić, czy logika, która będzie czytała xml, jest przygotowana do obsługi brakującego elementu lub xsi: nil; jeśli nie, konieczne może być użycie jednego z tych formularzy; to znaczy, może być konieczne utracenie rozróżnienia między zerowym/brakującym elementem a pustym elementem. – ToolmakerSteve

+0

@RobHruska tak, masz rację, jest to definicja pustego elementu, ale jeśli weźmiemy pod uwagę definicję W3C wskazaną przez KitsuneYMG, to definiuje ona, że ​​element musi być zerowy i uważam, że reprezentacja jest bardziej definicja tag, a następnie reprezentacja jego obecnego stanu, więc nie zgadzam się z tą odpowiedzią i uważam, że pusta jest najlepszą reprezentacją elementu zerowego. Pomysł jest prosty, aby zachować dobrą strukturę, potrzebujesz wszystkich elementów do reprezentacji, inaczej nie wiedziałbyś o jego istnieniu, a zatem mógłbyś fałszywie to przedstawić. – Oakcool

Powiązane problemy