¿Qué es un elemento vacío?

Según la especificación XML, esta es la definición de un elemento vacío:

Se dice que un elemento sin contenido está vacío.] La representación de un elemento vacío es una etiqueta de inicio seguida inmediatamente de una etiqueta de finalización o una etiqueta de elemento vacío.

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

Ahora, no tengo problemas para entender las tags de elementos vacíos: y no es posible ningún malentendido. Pero me parece que el estándar se contradice en el otro caso: por un lado, dice que cualquier etiqueta sin content está vacía, por otro lado, dice que esto puede representarse mediante una etiqueta de inicio seguida inmediatamente por un final -etiqueta. Pero si miramos la definición de content :

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

Me parece que el content consiste en dos partes opcionales, CharData? y un grupo ()* . Pero como estas dos partes son opcionales, significa que nada (como en, ausencia de caracteres) coincide con esta producción. Por lo tanto, si intentara hacer coincidir esta definición de contenido con lo que está dentro de , obtendría una coincidencia positiva. Así que, por un lado, esta es una etiqueta vacía porque es “una etiqueta de inicio seguida de una etiqueta de finalización”, por otro lado, no está vacía porque entre las tags puedo coincidir positivamente con la definición de regla de producción [ 43] para el contenido, en cuyo caso contiene contenido, lo que significa que no puede estar vacío.

¿Alguien puede explicar qué reglas tienen prioridad? ¿Alguien sabe acerca de las implementaciones de DOM o analizador que tienen opiniones diferentes sobre esto?

Pero como estas dos partes son opcionales, significa que nada (como en, ausencia de caracteres) coincide con esta producción.

Eso puede ser cierto, pero la redacción en la especificación sobre este tema es bastante clara. Incluso hay ejemplos de elementos vacíos en el siguiente párrafo.

  

Entonces, la única forma (en este contexto, con la redacción y los ejemplos que lo rodean) de leer

Un elemento sin contenido

sería incluir “contenido que (al mismo tiempo que la producción) está completamente vacío” (es decir, de longitud cero, ni siquiera espacio en blanco).

  

y

  

son ambos elementos vacíos. Cualquier producción de estándares debe interpretarse para tener este resultado.

Quería comprobar qué variaciones diferentes de “vacío” en realidad están vacías.

Variación A

da un árbol de

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

Variación B

da un árbol DOM de:

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

Variación C

Espacio

da un árbol DOM de:

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

Variación D

Pestaña

da un árbol DOM de:

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

Variación E

CRLF

da un árbol DOM de:

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

Todas las variaciones de texto dan el mismo árbol DOM. Cuando se solicita a un documento XML que se serialice, el árbol DOM:

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

resultados en el texto serializado:

 < ?xml version="1.0"?>  

Agregar manualmente un nodo de texto vacío

Quería ver qué pasa si construyo el árbol DOM:

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

usando el pseudo-código:

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

Cuando ese documento DOM se guarda en una secuencia, sale como:

 < ?xml version="1.0"?>  

Incluso cuando el elemento está forzado a tener un hijo (es decir, forzado a no estar vacío), el DOM lo toma como vacío.

Forzar nodo de texto con espacio en blanco

Y luego, si me aseguro de poner algunos espacios en blanco en el nodo TEXT :

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

Sale como el XML:

 < ?xml version="1.0" ?>   

con el árbol DOM:

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

Interesante; no es redondo-triplicable.

Forzar una TAB CRLF

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

Sale como el XML:

 < ? xml version = "1.0"?>
  TAB LF
 CR    
 

con el árbol DOM:

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

Sí, XML convierte todos los CR en LF , y sí, no es de ida y vuelta. Si analiza:

 < ? xml version = "1.0"?>
  TAB LF
 CR   
 

Obtendrás el árbol DOM de:

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

Setting element.text

Finalmente llegamos a lo que sucede si establece el texto de un elemento a través de .text propiedad .text .

No establecer texto

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

da el árbol DOM:

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

y el XML:

 < ?xml version="1.0"?>  

Establecer texto en blanco

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

da el árbol DOM:

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

y el XML:

 < ?xml version="1.0"?>  

Configurando un espacio simple

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

da el árbol DOM:

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

y el XML:

 < ?xml version="1.0"?>   

Configuración de más whitepsace

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

da el árbol DOM:

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

y el XML:

 < ? xml version = "1.0"?>  
  LF
 TAB LF
 

Entonces, lo que te dijeron era cierto, desde cierto punto de vista.

  • una cadena xml que contenga solo espacios en blanco en el elemento estará vacía cuando se analice
  • un elemento DOM que contenga solo espacios en blanco en su nodo de texto representará el espacio en blanco cuando se convierta en una cadena xml