QDomDocument: ошибка setContent с тегом XML - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь установить для моего файла XML значение QDomDocument, используя setContent, и он возвращает ошибку.

Мой файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Tag1>
        <Attribute1>5</Attribute1>
        <Attribute2>5</Attribute2>
    </Tag1>
    <Settings\it.server.com>
        <Attribute1>1</Attribute1>
    </Settings\it.server.com>
</root>

Вот фрагмент моего кода:

QFile file(fileName);

if (file.open(QIODevice::ReadOnly)) {
    QDomDocument domDocument;

    QString errorStr;
    int errorLine;
    int errorColumn;

    if (!domDocument.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
        qDebug() << errorStr << errorLine << errorColumn;
}

При запуске я получаю следующее сообщение об ошибке:

ошибка: ошибка при синтаксическом анализе элемента 7 11

Где строка =7 и column = 11.

Теперь я почти уверен, что это возможно из-за "\" или "."символ в теге (Настройки \ it.server.com) , который может вызывать его сбой.XML нельзя изменить, потому что он из внешнего источника.Мой вопрос в любом случае вокруг этого с помощью QDomDocument?

Я изучил QXmlStreamReader и Writer, но я не понял, как обновить атрибуты.QDomDocument имеет лучшие возможности для этого.

1 Ответ

0 голосов
/ 24 февраля 2019

Синтаксический анализатор XML принимает буквы, цифры, точки, дефисы и т. Д. Перед синтаксическим анализом необходимо удалить недопустимые символы:

QFile f(filename);
if (!f.open(QFile::ReadOnly | QFile::Text)) return;

QTextStream in(&f);
QString content = in.readAll(); // Get the content

content.replace("\\", "_"); // Remove all '\' char

if (!domDocument.setContent(content, false, &errorStr, &errorLine, &errorColumn))
        qDebug() << errorStr << errorLine << errorColumn;

Если ваш XML-файл огромен, вы также можете создать свой собственный QXmlInputSource создать подкласс и заменить недопустимые символы во время чтения (см. QXmlInputSource :: next () )

...