Kann ich die Reihenfolge der XML-Attribute mithilfe eines Schemas erzwingen?

Unsere C ++ - Anwendung liest Konfigurationsdaten aus XML-Dateien, die ungefähr so ​​aussehen:

<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>

Die vollständige Anwendungskonfiguration besteht aus ~ 2500 dieser XML-Dateien (was mehr als 1,5 Millionen Schlüssel / Wert-Attribut-Paare ergibt). Die XML-Dateien stammen aus vielen verschiedenen Quellen / Teams und werden anhand eines Schemas validiert. Manchmal jedoch die<value/> Knoten sehen so aus:

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

oder dieses:

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

Um diesen Prozess zu beschleunigen, verwenden wirExpat die XML-Dokumente zu analysieren. Expat macht die Attribute als Array verfügbar - wie folgt:

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);
 }
}

Dies überträgt die gesamte Verantwortung auf unsereProcessAttribute() Funktion, um den 'Schlüssel' zu lesen und zu entscheiden, was mit dem Wert geschehen soll.Das Profiling der App hat gezeigt, dass ~ 40% der gesamten XML-Parsing-Zeit mit diesen Attributen nach Name / Zeichenfolge zu tun haben.

Der Gesamtprozess könnte dramatisch beschleunigt werden, wenn ich die Reihenfolge der Attribute garantieren / erzwingen könnte (für den Anfang keine Zeichenfolgenvergleiche inProcessAttribute()). Zum Beispiel, wenn 'id' Attribut warimmer Das erste Attribut, mit dem wir uns direkt befassen könnten:

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.
}

Entsprechend den W3C-Schemaspezifikationen kann ich verwenden<xs:sequence> in einem XML-Schema, um die Reihenfolge der Elemente zu erzwingen - aber es scheint nicht für Attribute zu funktionieren - oder ich verwende es falsch:

<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>

Gibt es eine Möglichkeit, die Attributreihenfolge in einem XML-Dokument zu erzwingen? Wenn die Antwort "Nein" lautet - könnte jemand vielleicht eine Alternative vorschlagen, die keine enorme Beeinträchtigung der Laufzeitleistung mit sich bringt?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage