LINUX.ORG.RU

[C++][Qt] Как быстро работать с XML

 ,


0

2

День добрый. До сих пор тут в read-only режиме был, но вот и у меня возникла проблема: надо читать с помощью Qt здоровые и сложные по структуре XML, и моя подсмотренная у одного XML-редактора реализация «читалки» оказалась дико тормозной.
Собственно вот эта функция, от которой все беды:

QDomElement SigmaDCFile::getXmlElement(const QDomNode & domNode, const QString& path, Qt::CaseSensitivity caseSensitivity) const {
    QStringList elementTagNames = path.split('/');
    QDomNodeList domNodeList = domNode.childNodes();
    for(int i = 0; i < domNodeList.count(); i++)
        if(domNodeList.at(i).toElement().tagName().compare(elementTagNames.first(),caseSensitivity) == 0) {
            elementTagNames.takeFirst();
            if(elementTagNames.isEmpty())
                return domNodeList.at(i).toElement();
            else
                return getXmlElement(domNodeList.at(i).toElement(),elementTagNames.join("/"), caseSensitivity);
        }
    return QDomElement();
}
Так-то, она весьма удобна - можно просто обращаться к любому элементу с помощью полного пути, и код загрузки краткий получается. Возможно в данном случае и простой доступ по пути/тегу к элементу получить, и тормозов не словить? как в пословице про рыбку и еще кое-что :) Так-то, структура XML-я фиксированная, но вот новые дочерние элементы таки могут появляться. И напрямую бежать по всему файлу с помощью QDomElement вариант унылый. P.S. Документацию Qt смотрел. Ничего подходящего не обнаружил, благо в XML я нуб.

Ответ на: комментарий от LamerOk

Теги могут добавляться - но только в определенные места (нижние уровни). Но ведь это и значит «произвольное множество», да? :/ Ладно, этот вопрос тогда снят.
А по списку - ну у меня второй вариант используется, но выше сказали «ненужно» ведь. Да и XSD опять опять же - как его там опишешь-то, если в name элемента нельзя юзать regexp-ы. Хоть и с моим зоопарком об XSD придётся забыть.

anarelian
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.