Могу ли я применить порядок атрибутов XML с помощью схемы?
Наше приложение C ++ считывает данные конфигурации из файлов XML, которые выглядят примерно так:
...
Полная конфигурация приложения состоит из ~ 2500 этих XML-файлов (что означает более 1,5 миллиона пар ключ / значение атрибута). Файлы XML поступают из разных источников / команд и проверяются на соответствие схеме. Однако иногда узлы выглядят так:
или это:
Чтобы сделать этот процесс быстрым, мы используемэмигрант разобрать документы XML. Expat предоставляет атрибуты в виде массива, например:
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);
}
}
Это возлагает всю ответственность на нашихProcessAttribute()
функция для чтения 'ключ» и решить, что делать со значением.Профилирование приложения показало, что ~ 40% общего времени анализа XML связано с этими атрибутами по имени / строке.
Весь процесс мог бы быть значительно ускорен, если бы я мог гарантировать / обеспечить порядок атрибутов (для начала, нет сравнения строк вProcessAttribute()
). Например, еслиЯ бы' атрибут былвсегда 1-й атрибут, с которым мы могли бы иметь дело напрямую:
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.
}
В соответствии со спецификациями схемы W3C, я могу использовать в XML-схеме для обеспечения порядка элементов - но это не таккажется, работает на атрибуты - или, возможно, яиспользую это неправильно:
Есть ли способ обеспечить порядок атрибутов в документе XML? Если ответ "нет» - может ли кто-нибудь предложить альтернативу, которая ненести огромный штраф производительности во время выполнения?