2009-01-05 13 views
9

¿Cómo se le dice al analizador XML que respete el espacio en blanco inicial y final?¿Se puede conservar el espacio en blanco inicial y final en XML?

Dim xml: Set xml = CreateObject("MSXML2.DOMDocument") 
xml.async = False 
xml.loadxml "<xml>1 2</xml>" 
wscript.echo len(xml.documentelement.text) 

impresiones encima cabo 3.

Dim xml: Set xml = CreateObject("MSXML2.DOMDocument") 
xml.async = False 
xml.loadxml "<xml> 2</xml>" 
wscript.echo len(xml.documentelement.text) 

encima imprime 1. (me gustaría que imprima 2).

¿Hay algo especial que pueda poner en el documento xml para decirle al analizador que mantenga el espacio en blanco inicial y final en el documento?

ACLARACIÓN 1: ¿Existe un atributo que se puede especificar UNA VEZ al principio del documento para aplicarlo a todos los elementos?

ACLARACIÓN 2: Debido a que los contenidos de las entidades pueden tener datos Unicode, pero el archivo XML tiene que ser ASCII, todas las entidades están codificados - lo que significa CDATA de por desgracia no están disponibles.

+0

CDATA sin duda está disponible. Sin embargo, puede que tenga que usar más de uno por valor de elemento. –

+0

@michaelpryor: Acerca de todas las respuestas que recomiendan "xml: espacio". Este problema no tiene nada que ver con xml: space, que controla cómo un analizador trata los espacios en blanco * solo * nodos. Los nodos que se muestran definitivamente no son solo espacios en blanco. Vea mi solución, que es la única que realmente trata el problema. Cheers, –

+1

El problema no tiene * nada que ver con CDATA. CDATA solo está allí en el momento del análisis, en el conjunto de información, ya no está presente y los espacios en blanco * son * parte del conjunto de información. – bortzmeyer

Respuesta

8

Como os comentaba, todas las respuestas que recomiendan el uso de la xml:space="preserve" están equivocados.

El atributo xml:space sólo se puede utilizar para controlar el tratamiento de los espacios en blanco nodos sólo, es decir los nodos de texto compuestas enteramente de caracteres de espacio en blanco.

Esto no es en absoluto el caso con el problema actual.

De hecho, el código proporcionado a continuación correctamente obtiene una longitud de 2 para el nodo de texto contenido en:

<xml> 2</xml> 

Aquí está el código VB que consigue correctamente la longitud del nodo de texto (no hacer se olvide de 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 se pone 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, como se requiere.

Por lo tanto, este código es la solución que se estaba buscando.

+0

el atributo xml: space = "preserve" funcionó bien. No sé quién borró las respuestas que lo sugirieron, pero me funcionó bien. –

+2

@michaelpryor: Más exactamente, la respuesta al original. q. es: "No, no se debe poner nada especial en el documento XML ya que el analizador no recorta ningún nodo de texto que no sea de espacio en blanco. Simplemente use la propiedad" nodeValue "y no use la propiedad" text ". –

+0

On the line que asigna valor a 'n', ¿deberíamos tener' Len'? – Jaywalker

3

podría intentar ponerlo en un bloque CDATA:

<xml><![CDATA[ 2]]></xml> 
+0

A todo lo que respondió con "xml: espacio": este problema no tiene nada que ver con xml: space, que controla cómo trata el analizador los espacios en blanco * solo * nodos. Los nodos que se muestran definitivamente no son solo espacios en blanco. –

+0

Según mi anterior. comentario. Recomiendo que retire las respuestas incorrectas o que otras personas las rechacen por completo. Cheers, –

+0

El infoset es exactamente el mismo, con o sin CDATA. Este no es el problema. – bortzmeyer

3

Según lo mencionado por Dimitre Novatchev, para XML, el analizador no borra el espacio en blanco . 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. 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 

Este es 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; 
} 
Cuestiones relacionadas