QString в XML в QT

Мне нужно создать файл XML в QT, но я не использую классы QT XML для создания данных XML, но я создаю строки вручную (который содержит XML) и записываю их в файл, причина того, что классы QT не используются, заключается в том, что я нужно сохранить порядок атрибутов, но если я использую классы QT XMl, он записывает атрибут в случайном порядке.

До сих пор все было хорошо, пока я не получил текст HTML, который будет записан как значение тега в XML. мне нужно написать HTML-данные, как классы QT XMl пишут, например, "Это <Тестовые данные>" должно быть написано как "Это & lt: Тестовые данные & gt". здесь я заменил ";" с ":" для понимания цели.

Может ли кто-нибудь помочь мне с любой функцией в QString, которая может обнаружить XMl и преобразовать его перед записью в файл или во время записи в файл?

2 ответа

Проверьте QXmlStreamReader а также QXmlStreamWriter классы. Они находятся в QtCore и действительно полезны для обработки XML.

Вы должны сделать что-то вроде этого:

QString string;
QXmlStreamWriter writer(&string);
// use QXmlStreamWriter class to generate the XML
writer.setAutoFormatting(true);
writer.writeStartDocument();
...
writer.writeStartElement("html");
writer.writeStartElement("a");
writer.writeAttribute("href", "http://example.com/");
writer.writeCharacters("My wonderful link");
writer.writeEndElement(); // a
writer.writeEndElement(); // html
...
writer.writeEndDocument();

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

QString test = "<TestData>Valid XML</TestData>";
QString wrapper_start = "<?xml version=\"1.0\"?><dummyrootelement>";
QString wrapper_end = "</dummyrootelement>";
QDomDocument document;
if(document.setContent(wrapper_start + test + wrapper_end)) {
    // Valid XML, handle test here
} else {
    // Probably not valid XML
}

Причина, по которой вам нужны переменные wrapper_start и wrapper_end, заключается в том, что вы можете обрабатывать фрагменты XML между ними, вы можете рассматривать это как XML, который необходимо обработать:

<TestData>Data1</TestData><TestData>Data2</TestData>

но при этом возникнет ошибка синтаксического анализа, поскольку документ XML должен иметь один корневой элемент.

Кроме того, обратите внимание, что вышеупомянутый метод не рекомендован мной, но я упомянул его, потому что я понимаю боль и сочувствую всем, кто должен поддерживать устаревшие системы. Если ваше приложение основано на упорядочении атрибутов, я настоятельно рекомендую вам хотя бы рассмотреть возможность пересмотра архитектуры вашего приложения.

Другие вопросы по тегам