espacios - ¿Se puede conservar el espacio en blanco inicial y final en XML?
espacios en blanco en xml (3)
podrías intentar ponerlo en un bloque CDATA:
<xml><![CDATA[ 2]]></xml>
¿Cómo se le dice al analizador XML que respete el espacio en blanco inicial y final?
Dim xml: Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml>1 2</xml>"
wscript.echo len(xml.documentelement.text)
Arriba imprime 3.
Dim xml: Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml> 2</xml>"
wscript.echo len(xml.documentelement.text)
Arriba imprime 1. (Me gustaría imprimir 2).
¿Hay algo especial que pueda incluir en el documento xml para decirle al analizador que siga marcando el espacio en blanco en el documento?
ACLARACIÓN 1 : ¿Existe un atributo que pueda especificarse UNA VEZ al comienzo del documento para que se aplique a todos los elementos?
ACLARACIÓN 2 : Debido a que los contenidos de las entidades pueden tener datos unicode, pero el archivo xml debe ser simple ascii, todas las entidades están codificadas, lo que significa que los CDATA lamentablemente no están disponibles.
Como comenté, todas las respuestas que recomiendan el uso de xml:space="preserve"
son incorrectas .
El atributo xml:space
solo se puede usar para controlar el tratamiento de nodos que solo son espacios en blanco , es decir, nodos de texto compuestos enteramente de caracteres en espacios en blanco.
Este no es en absoluto el caso con el problema actual.
De hecho, el código proporcionado a continuación obtiene una longitud de 2 para el nodo de texto contenido en:
<xml> 2</xml>
Aquí está el código VB que obtiene correctamente la longitud del nodo de texto (no olvide agregar una referencia a "Microsoft XML, v 3.0"):
Dim xml As MSXML2.DOMDocument
Private Sub Form_Load()
Set xml = CreateObject("MSXML2.DOMDocument")
xml.async = False
xml.loadxml "<xml> 2</xml>"
Dim n
n = Len(xml.documentelement.selectSingleNode("text()").nodeValue)
wscript.echo Len(n)
End Sub
Si pones un punto de interrupción en la línea:
wscript.echo Len(n)
Verá que cuando el depurador se rompe allí, el valor de n
es 2, tal como se requiere.
Por lo tanto, este código es la solución que se buscaba.
Como lo menciona Dimitre Novatchev, para XML, el analizador sintáctico no elimina el espacio en blanco a voluntad. El espacio en blanco es parte si el valor del nodo. Como no hablo Visual Basic, aquí hay un programa C con libxml que imprime la longitud del primer nodo de texto. No hay absolutamente ninguna necesidad de establecer xml: espacio.
% ./whitespace "<foo> </foo>"
Length of " " is 1
% ./whitespace "<foo> 2</foo>"
Length of " 2" is 2
% ./whitespace "<foo>1 2</foo>"
Length of "1 2" is 3
Aquí está el programa:
#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
int
main(int argc, char **argv)
{
char *xml;
xmlDoc *doc;
xmlNode *first_child, *node;
if (argc < 2) {
fprintf(stderr, "Usage: %s XML-string/n", argv[0]);
return 1;
}
xml = argv[1];
doc = xmlReadMemory(xml, strlen(xml), "my data", NULL, 0);
first_child = doc->children;
first_child = first_child->children; /* Skip the root */
for (node = first_child; node; node = node->next) {
if (node->type == XML_TEXT_NODE) {
fprintf(stdout, "Length of /"%s/" is %i/n", (char *) node->content,
strlen((char *) node->content));
}
}
return 0;
}