2008-08-10 15 views
8

estoy generando algunos documentos XML y cuando se trata de la parte de dirección que tienen fragmentos que se ven así:¿Es una "mala práctica" ser sensible a los saltos de línea en los documentos XML?

<Address>15 Sample St 
Example Bay 
Some Country</Address> 

El XSLT que tengo para convertir esta a XHTML tiene alguna plantilla recursiva cobarde para convertir salto de línea caracteres dentro de cadenas a < br/> etiquetas.

Todo funciona bien; pero ¿se considera una "mala práctica" confiar en los saltos de línea dentro de los documentos XML? Si es así, ¿se recomienda que haga esto en su lugar?

<Address><Line>15 Sample St</Line> 
<Line>Example Bay</Line> 
<Line>Some Country</Line></Address> 

parece que sería muy incómodo para envolver cada lugar donde mi texto puede ser varias líneas con etiquetas como que ..

Respuesta

9

En general, se considera una mala práctica confiar en los saltos de línea, ya que es una forma frágil de diferenciar los datos. Si bien la mayoría de los procesadores XML conservarán cualquier espacio en blanco que coloque en su XML, no está garantizado.

El problema real es que la mayoría de las aplicaciones que generan su XML en un formato legible consideran todos los espacios en blanco en un XML intercambiable, y pueden colapsar esos saltos de línea en un solo espacio. Es por eso que su XSLT tiene que pasar por tales aros para representar los datos correctamente. Usar una etiqueta "br" simplificaría enormemente la transformación.

Otro posible problema es que si abre su documento XML en un editor XML y lo imprime bastante, es probable que pierda esos saltos de línea.

Si sigue usando saltos de línea, asegúrese de agregar un xml: space = "preserve" atribuir a la "dirección". (. Puede hacer esto en su DTD, si está usando uno)

Algunos sugirieron lectura

aplicaciones XML a menudo parecen tomar una actitud arrogante hacia el espacio en blanco porque las reglas acerca de los lugares en un documento XML en el espacio en blanco no importa a veces dar a estas aplicaciones rienda suelta a agregar o quitar espacios en blanco en ciertos lugares.

-1

sí, creo que el uso de un bloque CDATA protegería el espacio en blanco. Aunque algunas API de analizador le permiten conservar espacios en blanco.

2

Creo que el único problema real es que hace que el XML sea más difícil de leer. p.ej.

<Something> 
    <Contains> 
     <An> 
      <Address>15 Sample St 
Example Bay 
Some Country</Address> 
     </An> 
    </Contains> 
</Something> 

Si bastante XML no es una preocupación, probablemente no se preocupe por él, con tal de que está trabajando. Si XML es una preocupación, convertiría las nuevas líneas explícitas en etiquetas <br /> o \n antes de insertarlas en el XML.

1

Depende de cómo esté leyendo y escribiendo el XML.

Si XML se genera de forma automática - si los saltos de línea o explícita \ n banderas están siendo analizados en
- entonces no hay nada de qué preocuparse. Es probable que su entrada no tenga ningún otro XML, por lo que es más limpio no meterse con XML en absoluto.

Si las etiquetas están siendo trabajadas manualmente, aún así es más limpio tener un salto de línea, si me preguntas.

La excepción es si está utilizando DOM para obtener alguna estructura del XML. En ese caso, los saltos de línea son obviamente malvados porque no representan la jerarquía correctamente. Sin embargo, parece que la jerarquía es irrelevante para su aplicación, por lo que los saltos de línea parecen suficientes.

Si el XML se ve mal (especialmente cuando se genera automáticamente), Tidy puede ayudar, aunque funciona mejor con HTML que con XML.

-1

Lo que realmente debe hacer es convertir su XML a un formato que preserve el espacio en blanco.

Así que en lugar de tratar de reemplazar a \ n con < br/> que debe envolver todo el bloque en un <pre>

De esa manera, su dirección se conserva funcionalmente (si se incluye saltos de línea o no) y la XSTL puede elegir si desea conservar espacio en blanco en el resultado.

-1

recomiendo que usted debe agregar el <br/> saltos de línea o tal vez usar entidad salto de línea - &#x000D;

0

no veo qué tiene de malo <Line> etiquetas.
Aparentemente, la visualización de los datos es importante para usted, lo suficientemente importante como para mantenerla en sus datos (a través de saltos de línea en su primer ejemplo). Multa. Entonces realmente mantenerlo, no se basan en la "mágica" para guardarlo para ti. Conserve todos los datos que necesitará más adelante y no puede deducir perfectamente de la porción guardada de los datos, consérvelo incluso si se trata de datos de visualización (saltos de línea y otro formato). Su usuario (usuario final de otro desarrollador) se tomó el tiempo para dar formato a los datos de su agrado - ya sea decirle (API doc/texto cerca de la entrada) que no tiene intención de cumplir, o que - sólo mantenerlo.

-2

Si necesita sus saltos de línea conservados, utiliza un bloque CDATA, como tweakt said

De lo contrario cuidado. La mayoría de las veces, los saltos de línea serán preservados por el software XML, pero a veces no lo harán, y realmente no desea confiar en cosas que solo funcionan por coincidencia

2

¿Qué pasa con el uso de atributos para almacenar los datos? , en lugar de los nodos de texto:

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/> 

que conocen el uso de atributos frente a los nodos de texto es un tema debatido a menudo, pero me he pegado con atributos 95% del tiempo, y no he tenido ningún problema PORQUE de eso

1

Este es probablemente un ejemplo un poco engañoso, ya que la dirección es un poco no normalizada en este caso.Es una compensación razonable, sin embargo, dado que los campos de direcciones son difíciles de normalizar. Si haces que los saltos de línea lleven información importante, no te estás normalizando y haciendo que la oficina de correos interprete el significado del salto de línea.

Diría que normalmente este no es un gran problema, pero en este caso creo que la línea es la más correcta ya que muestra explícitamente que en realidad no interpreta lo que las líneas pueden significar en diferentes culturas. (Recuerde que la mayoría de los formularios para ingresar una dirección tienen código postal, etc., y la línea de direcciones 1 y 2.)

La incomodidad de tener la etiqueta de línea viene con XML normal, y ha sido muy debatido en codificación de terror. http://www.codinghorror.com/blog/archives/001139.html

1

La especificación XML tiene algo que decir con respecto a whitespace y linefeeds and carriage returns in particular. Por lo tanto, si se limita a avances de línea verdaderos (x0A), debería estar bien. Sin embargo, muchas herramientas de edición reformatearán XML para una "mejor presentación" y posiblemente eliminarán la sintaxis especial. Un enfoque más robusto y más limpio que el "< línea> </línea>" idea sería simplemente usar espacios de nombres y de incorporar contenido XHTML, por ejemplo:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address> 

No hay necesidad de reinventar la rueda cuando se trata de vocabularios estándar .

3

Pocas personas han dicho que los bloques CDATA le permitirán retener saltos de línea. Esto está mal. Las secciones de CDATA solo harán que el marcado se procese como datos de caracteres; no cambiarán el procesamiento de salto de línea.

<Address>15 Sample St 
Example Bay 
Some Country</Address> 

es exactamente el mismo que

<Address><![CDATA[15 Sample St 
Example Bay 
Some Country]]></Address> 

La única diferencia es la forma en diferentes APIs informan de esto.

Cuestiones relacionadas