Cos’è un elemento vuoto?

Secondo la specifica XML, questa è la definizione di un elemento vuoto:

Un elemento senza contenuto è detto essere vuoto.] La rappresentazione di un elemento vuoto è o un tag di inizio immediatamente seguito da un tag di fine, o un tag di elemento vuoto.

(vedi: http://www.w3.org/TR/REC-xml/#NT-content )

Ora, non ho alcun problema a capire i tag vuoti: e non è ansible alcun equivoco. Ma mi sembra che lo standard si contraddica nell’altro caso: da un lato si dice che ogni tag senza content è vuoto, dall’altro dice che questo può essere rappresentato da un tag di inizio seguito immediatamente da una fine -etichetta. Ma se guardiamo la definizione di content :

 [43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)* 

Mi sembra che il content consista di due parti opzionali, CharData? e un gruppo ()* . Ma dal momento che entrambe queste parti sono opzionali, significherebbe che nulla (come in, assenza di caratteri) corrisponde a questa produzione. Quindi se provassi ad abbinare questa definizione di contenuto a qualunque cosa si trovi all’interno di otterrei una corrispondenza positiva. Quindi, da un lato questo è un tag vuoto perché è “un tag di inizio immediatamente seguito da un tag di fine”, d’altro canto non è vuoto perché tra i tag posso corrispondere positivamente alla definizione di regola di produzione [ 43] per il contenuto, nel qual caso contiene contenuti, il che significa che non può essere vuoto.

Qualcuno può spiegare quali regole hanno la precedenza? Qualcuno sa di eventuali implementazioni DOM o parser che hanno opinioni divergenti su questo?

Ma dal momento che entrambe queste parti sono opzionali, significherebbe che nulla (come in, assenza di caratteri) corrisponde a questa produzione.

Potrebbe essere vero, ma la formulazione delle specifiche su questo argomento è abbastanza chiara. Ci sono anche esempi per gli elementi vuoti nel prossimo paragrafo.

  

Quindi l’unico modo (in questo contesto, con la formulazione e gli esempi circostanti) da leggere

Un elemento senza contenuto

sarebbe quello di includere “contenuto che (pur corrispondendo alla produzione) è completamente vuoto” (cioè a lunghezza zero, nemmeno lo spazio bianco).

  

e

  

sono entrambi elementi vuoti. Qualsiasi produzione da standard deve essere interpretata per avere questo risultato.

Volevo verificare quali diverse varianti di “vuoto” siano effettivamente vuote.

Variazione A

dà un albero di

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

Variazione B

fornisce un albero DOM di:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

Variazione C

Spazio

fornisce un albero DOM di:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

Variazione D

Scheda

fornisce un albero DOM di:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

Variazione E

CRLF

fornisce un albero DOM di:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

Tutte le varianti di testo danno lo stesso albero DOM. Quando viene chiesto a un documento XML di serializzare se stesso, l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

risultati nel testo serializzato:

   

Aggiunta manuale di un nodo di testo vuoto

Volevo vedere cosa succede se costruisco l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" |- NODE_TEXT #text "" 

usando lo pseudo-codice:

 XmlDocument doc = new XmlDocument(); XmlElement santa = doc.appendChild(doc.CreateElement("Santa")); santa.appendChild(doc.CreateText("")); 

Quando quel documento DOM viene salvato su uno stream, viene visualizzato come:

   

Anche quando l’elemento è forzato ad avere un figlio (cioè costretto a non essere vuoto), il DOM lo prende per essere vuoto.

Forza il nodo di testo con spazi bianchi

E poi se mi assicuro di inserire degli spazi bianchi nel nodo TEXT :

 XmlDocument doc = new XmlDocument(); XmlElement santa = doc.appendChild(doc.CreateElement("Santa")); santa.appendChild(doc.CreateText(" ")); 

Viene fuori come XML:

    

con l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" |- NODE_TEXT #text " " 

Interessante; non è tondo-trippabile.

Forza un TAB CRLF

 XmlDocument doc = new XmlDocument(); XmlElement santa = doc.appendChild(doc.CreateElement("Santa")); santa.appendChild(doc.CreateText(TAB+LF+CR)); 

Viene fuori come XML:

 
  TAB LF
 CR    
 

con l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" |- NODE_TEXT #text "\t\n\n" 

Sì, XML converte tutti i CR in LF , e sì, non è round-trippable. Se analizzi:

 
  TAB LF
 CR   
 

otterrai l’albero DOM di:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

Impostazione di element.text

Finalmente arriviamo a cosa succede se imposti il ​​testo di un elemento attraverso la sua proprietà .text .

Imposta nessun testo :

 XmlDocument doc = new XmlDocument(); XmlElement santa = doc.appendChild(doc.CreateElement("Santa")); //santa.text = ""; example where we don't set the text 

dà l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" 

e l’XML:

   

Impostazione del testo vuoto

 XmlDocument doc = new XmlDocument(); XmlElement santa = doc.appendChild(doc.CreateElement("Santa")); santa.text = ""; //example where we do set the text 

dà l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" |- NODE_TEXT #text "" 

e l’XML:

   

Impostazione dello spazio singolo

 XmlDocument doc = new XmlDocument(); XmlElement santa = doc.appendChild(doc.CreateElement("Santa")); santa.text = " "; 

dà l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" |- NODE_TEXT #text " " 

e l’XML:

    

Impostazione di più whitepsace

 XmlDocument doc = new XmlDocument(); XmlElement santa = doc.appendChild(doc.CreateElement("Santa")); santa.text = LF+TAB+CR; 

dà l’albero DOM:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT Santa "" |- NODE_TEXT #text "\n\t\n" 

e l’XML:

   
  LF
 TAB LF
 

Quindi quello che ti hanno detto era vero, da un certo punto di vista.

  • una stringa xml che contiene solo spazi bianchi nell’elemento sarà vuota quando analizzata
  • un elemento DOM che contiene solo spazi bianchi nel suo nodo di testo renderà lo spazio bianco quando viene convertito in una stringa xml