Estoy lidiando con EXI ahora mismo.
No existe una buena herramienta universal para procesar EXI. Una vez que entra en las entrañas de EXI, se da cuenta de que hay un montón de delimitadores innecesarios en la secuencia binaria que son absolutamente y completamente innecesarios con un esquema. Algo de eso es gracioso.
¿Cómo crees que se codificaría lo siguiente en EXI si se especifican ambos valores?
<xs:complexType name="example">
<xs:sequence>
<xs:element name="bool1" type="xs:boolean" minOccurs="0" />
<xs:element name="bool2" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:complexType>
¿Crees que podría ser un máximo de 4 bits? 1 bit para indicar si bool1 está definido, y que el valor de bool1, seguido de otro bit para indicar si bool2 está definido, entonces el valor de bool2?
Good golly no!
Bueno, ¡déjenme decirles chicos y chicas! Así es como está codificado en realidad
+---- A value of 0 means this element (bool1) is not specified,
| 1 indicates it is specified
|+--- A value of x means this element is undefined,
|| 0 means the bool is set to false, 1 is set to true
||+-- A value of 0 means this element (bool2) is not specified,
||| 1 indicates it is specified
|||+- A value of x means this element is undefined
|||| 0 means the bool is set to false, 1 is set to true
||||
0x0x 4 0100 # neither bools are specified
0x10 8 00100000 # bool1 is not specified, bool2 is set to false
0x11 8 00101000 # bool1 is not specified, bool2 is set to true
100x 9 000000010 # bool1 is set to false, bool2 is not specified
110x 9 000010010 # bool1 is set to true, bool2 is not specified
1010 13 0000000000000 # bool1 is set to false, bool2 is set to false
1011 13 0000000001000 # bool1 is set to false, bool2 is set to true
1110 13 0000100000000 # bool1 is set to true, bool2 is set to false
1111 13 0000100001000 # bool1 is set to true, bool2 is set to true
^ ^
+-encoding--+
Which can be represented with this tree
0-0-0-0-0-0-0-0-0-0-0-0-0 (1010)
\ \ \ \ \
| | | | 1-0-0-0 (1011)
| | | |
| | | 1-0 (100x)
| | |
| | 1-0-0-0-0-0-0-0-0 (1110)
| | \ \
| | | 1-0-0-0 (1111)
| | |
| | 1-0 (110x)
| |
| 1-0-0-0-0-0 (0x10)
| \
| 1-0-0-0 (0x11)
|
1-0-0 (0x0x)
Un mínimo de 4 bits, MINIMO para no definir tampoco. Ahora estoy siendo un poco injusto, porque estoy incluyendo delimitadores, delimitadores que son completamente innecesarios.
Entiendo cómo funciona esto, ahora. Aquí está la especificación:
https://www.w3.org/TR/exi/
Diviértete leyendo esto! ¡Fue una GRAN OFERTA DE DIVERSIÓN PARA MI !!!! @@ ##! @
Ahora esto es solo con un esquema, y la especificación EXI dice específicamente que aún puede codificar XML que NO se ajusta a un esquema . Lo cual es gracioso porque se supone que es para pequeños dispositivos web pequeños. ¿Qué hace con los datos inesperados que no tiene disposiciones para manejar en un dispositivo integrado?
Por qué, simplemente mueres, por supuesto. No hay recuperación para algo que no esperas. No es que estas cosas tengan una pantalla, tengo suerte si puedo acceder a ella a través de un puerto serie.
He usado 4 diferentes generadores/analizadores XSD/XML generators. 3 de ellos se atragantaron con el esquema que tengo que usar. La recopilación de datos para C y C++ (recuerde que esto es para el sistema EMBEDDED con muy poca memoria y potencia de CPU) son terribles.
XSD describe básicamente una arquitectura de estructura o clase y no hay una sola herramienta que pueda encontrar que simplemente cree las clases. El ejemplo de XSD que di más arriba debería crear una estructura con 4 bools, 2 bools son los valores y 2 bools indican si están definidos.
¿Pero eso EXISTE? Bueno diablos, no.
Me gusta XML, para describir documentos. Realmente lo hago, pero esto es lo que odio de XML: para un estándar ampliamente adoptado, las herramientas disponibles son absolutamente terribles. Simplemente leer un esquema es algo difícil de hacer cuando está distribuido en múltiples espacios de nombres y documentos.
Rant diatriba, Huff HUF
La única razón por la que estamos usando esto es un comité de estándares insistido en ello. Lo que se hace es crear un monopolio para un pequeño grupo de empresas que ya lo implementaron, ese es el único propósito.
EXI no es un estándar ampliamente adoptado, XML es un encapsulador pobre para los datos numéricos, y es complicado implementarlo y no hay herramientas decentes para ello. EXIP está en la versión 5.0, todo lo que funciona que es de código abierto está en Java, al menos eso tengo.
Para mi campo de trabajo, EXI es solo una mala decisión de diseño. He trabajado en toneladas de protocolos de comunicación en varios sistemas integrados. Trabajé en DOCSIS, que usan todos los modernos módems de cable: usan un protocolo simple, extensible, tipo/longitud/valor con disposiciones para tratar con tipos no reconocidos, por lo que siempre se incluye la longitud. Es simple, lleva literalmente días implementar toda la pila.
EXI es muy difícil de codificar a mano, no hay procesadores decentes para él, y lo peor de todo, todos los procesadores que he encontrado que realmente funcionan bien con él, simplemente transfórmalo de EXI < -> XML - que es totalmente inútil
He recurrido a la escritura de mi propio analizador XSD, lo que significa que tengo que entender al menos toda la especificación XML para las partes de este diseño que lo utilizan, y eso es extenso. Lo que me hubiera tomado 2 semanas para hacer con cualquier especificación razonable, me llevó 10. Nadie en mi mundo va a usar esto a menos que se los meta en la garganta y no deberían, es una clavija cuadrada para un agujero redondo.
Este no es realmente el lugar para las preguntas de "opinión", lo siento. –