2010-01-18 14 views
17

Estoy viendo el resultado de una herramienta, volcando una tabla de base de datos a XML. Una de las columnas se llama 64 kbits, la herramienta que codifica como tal, y tengo que replicar que:¿Codifica el nombre del elemento XML que comienza con un número?

<_x0036_4kbit>0</_x0036_4kbit> 

¿Es esta una especie de estándar de codificación? ¿Dónde puedo obtener más información al respecto?

Respuesta

15

Bueno, no parece ser demasiado estándar, pero XML no permite explícitamente los números (y algunas otras cosas) como el primer carácter del nombre de un elemento:

NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | 
        [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | 
        [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | 
        [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | 
        [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] 

Esta codificación aquí sólo un poco escapa a la primer personaje si no se ajusta a esos requisitos. Utiliza el valor hexadecimal de ese personaje. _x0036_ obviamente corresponde a hexadeximal 0x36 que es 54 en decimal y representa el dígito 6.

6

Un nombre XML no puede comenzar con un dígito, por lo que debe usarse alguna otra representación que pueda entenderse como '6'.

En su lugar, la herramienta ha elegido escribir la representación hexadecimal del carácter, rodeada de guiones bajos. El código \x0036 es el código hexadecimal para el carácter '6', que es 54 en decimal. Los signos de subrayado son caracteres válidos al comienzo de un nombre XML, por lo que esto funciona.

Esta misma técnica podría usarse para escapar de otros caracteres que no son válidos en los nombres XML. Esta técnica es utilizada, por ejemplo, por XmlConvert de Microsoft, como se describe en here, pero estoy seguro de que hay otras herramientas que también usan la misma técnica.

1

Esa codificación no es predeterminada para XML, pero su herramienta parece necesaria, ya que los elementos deben comenzar con small character set.

Esa secuencia _x0036_ representa un número hexadecimal 36 (decimal 54), que representa su carácter 6 en la tabla ASCII.

40

La palabra oficial es que la restricción impuesta a las convenciones de nomenclatura Xml se hereda del SGML principal de Xml, con una sola excepción: en Xml, como una opción adicional, los nombres pueden comenzar con un carácter de subrayado '_'.

SGML fue desarrollado por IBM en la década de 1960, por un grupo de mentes que pensaban en el estilo de los años sesenta. Como resultado, la tormenta de ideas que condujo a la creación de SGML probablemente se haya distraído por la idea abrumadora de que las naves espaciales, los viajes en el tiempo y los fusiles fabricados con papel de aluminio para protegerse contra 'ellos extraterrestres' y sus intentos tontos de provocación de pensamiento y control mental fueron procesos de pensamiento justificados.

So. La pregunta aún permanece. ¿Por qué SGML no permite números? Además, ¿por qué habría algún tipo de restricción impuesta sobre el uso de cualquier carácter que no sean los caracteres de control? <,>, & y espacio vacío? Sería una locura, seguramente, presentarle al geek de la computadora tantas claves para tantos personajes diferentes, solo para evitar que él o ella las use.

La razón más importante es el analizador sintáctico de la década de 1960, y sigue la regla de la complejidad hasta cierto grado de pedantería abierta.

'Cuanto más simple sea el analizador es, más rápido se realizará'

El alfabeto es el 26 de capital + 26 caracteres uncapital grande en total, y eso es 52. Los números de Permitir es un adicional de diez dígitos, que es aproximadamente una ¡sexto más!

En términos humanos, esto sería como tener que lavar seis ollas horriblemente incrustadas de suciedad, cada una tardando una hora en limpiarse, y luego escondidas debajo de la última olla es una olla de bonificación extra para lavar, y debes lavarla ! Tienes que repetir esta rutina todos los días por el resto de tu vida, y eso es exactamente lo que te gusta. ¡Precisamente!

Los documentos de lenguaje de marcado tienen una tendencia a aumentar el contenido. Por lo tanto, menos trabajos para el analizador, significan un aumento directo en la velocidad de rendimiento. Los beneficios luego se filtran a través de los rangos hasta que se metamorfosean en puro rendimiento lucrativo.

En los 'Viejos días de caballo, carro y un Commodore 64' era mucho más responsabilidad del usuario contar sus bits y bytes manualmente, para que los kilobytes se solucionaran solos. Sin embargo, como la CPU moderna es más capaz de hacer frente a su antiguo predecesor, las restricciones impuestas por el analizador se han vuelto más importantes que los problemas de rendimiento.

Si te sirve de consuelo, si tuviera que diseñar un lenguaje Mark-up yo mismo (que por razones de argumento, llamaremos a NAM-LIT-MAML, porque el impresionante lenguaje de marcación de Nicholas es el margen de beneficio más impresionante idioma (¡siempre!), entonces le permitiría usar cualquier número de todos los personajes de la historia completa del mundo, y de hecho el universo, sin excepción, y trabajaría muy duro para crear algunos caracteres nunca antes utilizados para el uso propio del lenguaje, que aún podría utilizarse dentro del documento mediante el uso de su propio carácter de escape que no se parece en nada a ningún otro personaje que alguna vez haya sido utilizado alguna vez.

Las restricciones impuestas por Xml se heredan de SGML y todos podemos estar de acuerdo en que en este día y edad de los naves espaciales de la nave espacial y otros mamíferos robóticos útiles, son innecesarios, estúpidos e ir contra la corriente de la programación orientada a objetos.

lecturas adicionales al http://www.w3.org/TR/REC-xml/

Aunque la forma más simple que he encontrado para hacer compatible un nombre XML es incluir el sufijo '_', no existe un estándar y, como tales otros métodos están en uso.

En su ejemplo, el primer carácter se ha convertido en un valor hexadecimal. Este valor hexadecimal representa el carácter '6' en ASCII, Unicode e indudablemente otros.

Lo bueno de usar valores hexadecimales es que todos los caracteres en un conjunto de códigos, p. Unicode puede estar representado.

Lo malo es que no son legibles de un vistazo.

+4

"In the 'Ye olde days" - la "Y" en "Ye" no es una "Y", es una antigua letra inglesa para "Th" que simplemente parecía una "Y" distorsionada de la misma manera que el alemán tiene una letra especial que es más o menos para "ss", pero se parece más a una "B" distorsionada. Entonces dijiste "En los 'viejos tiempos'. Claramente puedo forzar que esto sea relevante, muestra que no debes permitir demasiadas letras o te da caos y confusión. De hecho, SGML lo entendió mal: solo necesita una letra para definir un número infinito de nombres de la forma más clara y sencilla posible, y esa letra obviamente debe ser la "O" mayúscula. – Steve314

+2

Caracteres en cuestión: espina (þ) y Eszett (ß). – jdmichal

+0

Todo esto es entretenido, pero me alegro de que diseñen XML con esa "limitación". Sin duda, hace que la integración con otros lenguajes de programación del mundo real (a diferencia de scifi) sea mucho más fácil. Porque de lo contrario, habría muchas personas que pensaron que era una buena idea comenzar su etiqueta con un número y no les importaba quién tenía que consumirla. – jep

4

IIRC (Estuve allí, pero fue hace mucho tiempo) se pensaba que sería muy común mapear los atributos del elemento XML & a los constructos de lenguaje de programación, que están representados por variables, y muy pocos (cualquiera ?) los lenguajes de programación permiten nombres de variables que comienzan con números. Por lo tanto, la idea es que los nombres de elementos/atributos XML se ajusten bien a las reglas de nomenclatura variable de la mayoría de los idiomas. ¿Todavía creo esto? Si estuviéramos haciendo XML de nuevo, ¿estaría bien con esto? No sé; sin embargo, sería una discusión interesante.

Cuestiones relacionadas