¿Puedo imponer el orden de los atributos XML utilizando un esquema?

Nuestra aplicación C ++ lee datos de configuración de archivos XML que se parecen a esto:

<data>
 <value id="FOO1" name="foo1" size="10" description="the foo" ... />
 <value id="FOO2" name="foo2" size="10" description="the other foo" ... />
 ...
 <value id="FOO300" name="foo300" size="10" description="the last foo" ... />
</data>

La configuración completa de la aplicación consta de ~ 2500 de estos archivos XML (que se traducen en más de 1.5 millones de pares de atributos clave / valor). Los archivos XML provienen de muchas fuentes / equipos diferentes y se validan contra un esquema. Sin embargo, a veces la<value/> Los nodos se ven así:

<value name="bar1" id="BAR1" description="the bar" size="20" ... />

o esto:

<value id="BAT1" description="the bat" name="bat1"  size="25" ... />

Para hacer este proceso rápido, estamos usandoExpatriados Para analizar los documentos XML. Expat expone los atributos como una matriz, como esto:

void ExpatParser::StartElement(const XML_Char* name, const XML_Char** atts)
{
 // The attributes are stored in an array of XML_Char* where:
 //  the nth element is the 'key'
 //  the n+1 element is the value
 //  the final element is NULL
 for (int i = 0; atts[i]; i += 2) 
 {
  std::string key = atts[i];
  std::string value = atts[i + 1];
  ProcessAttribute (key, value);
 }
}

Esto pone toda la responsabilidad en nuestroProcessAttribute() función para leer la 'clave' y decidir qué hacer con el valor.La creación de perfiles de la aplicación ha demostrado que aproximadamente el 40% del tiempo total de análisis de XML se ocupa de estos atributos por nombre / cadena.

El proceso general podría acelerarse drásticamente si pudiera garantizar / imponer el orden de los atributos (para empezar, no hay comparaciones de cadenas enProcessAttribute()). Por ejemplo, si el atributo 'id' erasiempre El 1er atributo lo podríamos tratar directamente:

void ExpatParser::StartElement(const XML_Char* name, const XML_Char** atts)
{
 // The attributes are stored in an array of XML_Char* where:
 //  the nth element is the 'key'
 //  the n+1 element is the value
 //  the final element is NULL
 ProcessID (atts[1]);
 ProcessName (atts[3]);
 //etc.
}

De acuerdo con las especificaciones del esquema W3C, puedo usar<xs:sequence> en un esquema XML para imponer el orden de los elementos, pero parece que no funciona para los atributos, o tal vez lo estoy usando incorrectamente:

<xs:element name="data">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="value" type="value_type" minOccurs="1" maxOccurs="unbounded" />
  </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:complexType name="value_type">
 <!-- This doesn't work -->
 <xs:sequence>
  <xs:attribute name="id" type="xs:string" />
  <xs:attribute name="name" type="xs:string" />
  <xs:attribute name="description" type="xs:string" />
 </xs:sequence>
</xs:complexType>

¿Hay alguna forma de imponer el orden de los atributos en un documento XML? Si la respuesta es "no", ¿podría alguien sugerir una alternativa que no conlleve una gran penalización en el rendimiento en tiempo de ejecución?

Respuestas a la pregunta(8)

Su respuesta a la pregunta