Qual è il modo corretto di rappresentare elementi XML null?


166

Ho visto nullelementi rappresentati in diversi modi:

L'elemento è presente con xsi:nil="true":

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

L'elemento è presente, ma rappresentato come un elemento vuoto (che credo sia sbagliato poiché "vuoto" e nullsono semanticamente diversi):

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

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

L'elemento non è presente affatto nel markup restituito :

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

L'elemento ha un <null/>elemento figlio (da TStamper di seguito):

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

Esiste un modo corretto o canonico per rappresentare un tale nullvalore? Ci sono modi aggiuntivi rispetto agli esempi sopra?

L'XML per gli esempi sopra è inventato, quindi non leggere troppo in esso. :)

Risposte:


121

xsi: nil è il modo corretto di rappresentare un valore tale che: Quando viene emessa la chiamata DOM Level 2 getElementValue (), viene restituito il valore NULL. xsi: nil viene anche usato per indicare un elemento valido senza contenuto anche se quel tipo di contenuto normalmente non consente elementi vuoti.

Se viene utilizzato un tag vuoto, getElementValue () restituisce la stringa vuota ("") Se il tag viene omesso, non è presente nemmeno un tag autore. Questo può essere semanticamente diverso dall'impostarlo su 'zero' (Es. Impostare "Serie" su zero potrebbe essere che il libro non appartiene a nessuna serie, mentre omettere la serie potrebbe significare che la serie è un elemento inapplicabile all'elemento corrente.)

Da: W3C

Schema XML: Structures introduce un meccanismo per segnalare che un elemento deve essere accettato come · valido · quando non ha contenuto nonostante un tipo di contenuto che non richiede o addirittura necessariamente consente il contenuto vuoto. Un elemento può essere · valido · senza contenuto se ha l'attributo xsi: nil con il valore vero. Un elemento così etichettato deve essere vuoto, ma può contenere attributi se consentito dal tipo complesso corrispondente.

Un chiarimento:
se si dispone di un elemento xml del libro e uno degli elementi figlio è book: series si hanno diverse opzioni quando si compila:

  1. Rimozione completa dell'elemento: questo può essere fatto quando si desidera indicare che le serie non si applicano a questo libro o che il libro non fa parte di una serie. In questo caso xsl trasforma (o altri processori basati su eventi) che hanno un modello che corrisponde al libro: le serie non verranno mai chiamate. Ad esempio, se il tuo xsl trasforma l'elemento libro in una riga di tabella (xhtml: tr) potresti ottenere un numero errato di celle di tabella (xhtml: td) usando questo metodo.
  2. Lasciare vuoto l'elemento - Ciò potrebbe indicare che la serie è "" o è sconosciuta o che il libro non fa parte di una serie. Qualsiasi trasformazione xsl (o altro parser basato su evernt) che corrisponda al libro: verrà chiamata la serie. Il valore di current () sarà "". Otterrai lo stesso numero di tag xhtml: td usando questo metodo come con il prossimo descritto.
  3. Usando xsi: nil = "true" - Ciò significa che l'elemento book: series è NULL, non solo vuoto. La tua trasformazione xsl (o altro parser basato su eventi) che ha un libro di abbinamento modello: verrà chiamata la serie. Il valore di current () sarà vuoto (non stringa vuota). La principale differenza tra questo metodo e (2) è che il tipo di schema del libro: serie non deve consentire la stringa vuota ("") come valore valido. Ciò non ha alcun senso per un elemento serie, ma per un elemento linguaggio definito come tipo enumerato nello schema, xsi: nil = "true" consente all'elemento di non avere dati. Un altro esempio potrebbe essere rappresentato da elementi di tipo decimale. Se si desidera che siano vuoti, è possibile unire una stringa enumerata che consente solo "" e un decimale, oppure utilizzare un decimale nillabile.

11
L'uso di xsi: nil è corretto, ma è necessario assicurarsi che sia all'interno dello spazio dei nomi corretto: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
STW

In realtà lo è xmlns:xsi="http://w3.org/2001/XMLSchema-instance". Nota http: // mancante. È importante perché la stringa dello spazio dei nomi è in realtà solo una stringa per il parser xml e non un uri.
Burak Arslan,

9
Heh, credo che sia ancora leggermente sbagliato. Dovrebbe essere xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance". Nota "www.". Vedi w3.org/TR/xmlschema-1/#no-xsi
Janne Mattila,

Come affermato nella mia risposta, non sono d'accordo con l'interpretazione poiché non è una rappresentazione dello stato dell'elemento, ma un vincolo all'utilizzo dell'elemento
Oakcool,

2
@ChrisV: non vero, il xsi:prefisso deve essere dichiarato. Un parser XML compatibile con lo spazio dei nomi rifiuterà il documento XML se si tenta di utilizzare il xsi:prefisso senza dichiararlo. Le specifiche rilevanti qui sono w3.org/TR/xml-names/#nsc-NSDeclared (" Vincolo dello spazio dei nomi: prefisso dichiarato") che dice che gli unici prefissi predefiniti sono xml:e xmlns:. Lo schema XML si basa sulle specifiche degli spazi dei nomi XML, ma non aggiunge ulteriori prefissi predefiniti, poiché ciò violerebbe effettivamente le specifiche degli spazi dei nomi XML.
Simon Kissane,

9

Non esiste una risposta canonica, dal momento che XML sostanzialmente non ha un concetto nullo. Ma suppongo che tu voglia il mapping Xml / Object (poiché i grafici degli oggetti hanno valori null); quindi la risposta per te è "qualunque sia il tuo strumento utilizza". Se scrivi la gestione, ciò significa che preferisci. Per gli strumenti che utilizzano lo schema XML, xsi:nilè la strada da percorrere. Per la maggior parte dei mappatori, omettere l'elemento / attributo corrispondente è il modo per farlo.


8

Dipende da come convalidi il tuo XML. Se si utilizza la convalida dello schema XML, il modo corretto di rappresentare i nullvalori è con l' xsi:nilattributo.

[ Fonte ]


7

La documentazione nel collegamento w3

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

dice che queste sono le forme consigliate.

<test></test>
<test/>

L'attributo menzionato nell'altra risposta è un meccanismo di validazione e non una rappresentazione di stato. Consultare il http://www.w3.org/TR/xmlschema-1/#xsi_nil

Schema XML: Structures introduce un meccanismo per segnalare che un elemento dovrebbe essere accettato come · valido · quando non ha contenuto nonostante un tipo di contenuto che non richiede o addirittura necessariamente consente il contenuto vuoto. Un elemento può essere · valido · senza contenuto se ha l'attributo xsi: nil con il valore vero. Un elemento così etichettato deve essere vuoto , ma può contenere attributi se consentito dal tipo complesso corrispondente.

Per chiarire questa risposta: Contenuto

  <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
Questa è la raccomandazione per gli elementi vuoti ; sei dell'opinione che vuoto === null? Credo che ci sia una differenza tra i due, sebbene sia spesso situazionale. Se stai affermando che sono uguali, ti consiglio di menzionare tale argomento nella tua risposta.
Rob Hruska,

1
Vuoto non è uguale a null; se lo fosse, questa domanda stackoverflow non sarebbe mai stata posta. Questa risposta è sbagliata Tuttavia, il programmatore dovrebbe determinare se la logica che leggerà l'xml è pronta a gestire un elemento mancante o xsi: nil; in caso contrario, potrebbe essere necessario utilizzare una di queste forme; vale a dire, potrebbe essere necessario perdere la distinzione tra elemento nullo / mancante e un elemento vuoto.
ToolmakerSteve

@RobHruska sì, hai ragione, è la definizione di un elemento vuoto, ma se prendi in considerazione la definizione W3C che punta da KitsuneYMG, definisce che l'elemento deve essere nullo e credo che quella rappresentazione sia più una definizione del tag quindi la rappresentazione del suo stato attuale, quindi non sono d'accordo con quella risposta, e credo che il vuoto sia la migliore rappresentazione di un elemento null. L'idea è semplice, per mantenere una buona struttura, è necessario che tutti gli elementi siano rappresentati, altrimenti non si sarebbe a conoscenza della sua esistenza e quindi si potrebbe travisare.
Oakcool,

4

Si utilizza xsi:nilquando la semantica dello schema indica che un elemento ha un valore predefinito e che il valore predefinito deve essere utilizzato se l'elemento non è presente. Devo presumere che ci siano persone intelligenti a cui la frase precedente non è un'idea evidentemente terribile, ma suona per me nove tipi di male. Ogni formato XML con cui abbia mai lavorato rappresenta valori nulli omettendo l'elemento. (O attributo e buona fortuna contrassegnare un attributo con xsi:nil.)


Se in un'app di pubblicazione di documenti si desidera che la data nella pagina del titolo sia impostata automaticamente sulla data corrente se l'elemento non ha contenuto, omettere completamente l' dateelemento non è di grande aiuto, poiché l'app non ha idea di dove si desidera nella pagina del titolo la data da visualizzare. (Se l'elemento omesso ha una sola posizione possibile, questo non è un problema; nei vocabolari di documenti reali quasi tutti gli elementi hanno molte posizioni possibili.)
CM Sperberg-McQueen,

4

La semplice omissione dell'attributo o dell'elemento funziona bene con dati meno formali.

Se hai bisogno di informazioni più sofisticate, gli schemi GML aggiungono l'attributo nilReason, ad esempio: in GeoSciML :

  • xsi:nil con un valore "true" viene utilizzato per indicare che non è disponibile alcun valore
  • nilReasonpuò essere utilizzato per registrare informazioni aggiuntive per valori mancanti; questo può essere uno dei motivi GML standard ( missing, inapplicable, withheld, unknown), o testo preceduto da other:, oppure può essere un collegamento URI a una spiegazione più dettagliata.

Quando si scambiano dati, il ruolo per il quale viene comunemente utilizzato XML, i dati inviati a un destinatario o per un determinato scopo possono avere contenuti oscurati che sarebbero disponibili a qualcun altro che ha pagato o con un'autenticazione diversa. Conoscere il motivo per cui mancava il contenuto può essere molto importante.

Gli scienziati si preoccupano anche del perché mancano informazioni. Ad esempio, se è stato eliminato per motivi di qualità, potrebbe essere necessario visualizzare i dati errati originali.


2

In molti casi lo scopo di un valore Null è quello di servire per un valore di dati che non era presente in una versione precedente dell'applicazione.

Supponiamo quindi di avere un file XML dalla tua applicazione "ReportMaster" versione 1.

Ora in ReportMaster versione 2 sono stati aggiunti alcuni attributi che possono essere definiti o meno.

Se si utilizza la rappresentazione "no tag significa null", si ottiene la compatibilità automatica con le versioni precedenti per la lettura del file xml di ReportMaster 1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.