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 должен иметь один корневой элемент.
Кроме того, обратите внимание, что вышеупомянутый метод не рекомендован мной, но я упомянул его, потому что я понимаю боль и сочувствую всем, кто должен поддерживать устаревшие системы. Если ваше приложение основано на упорядочении атрибутов, я настоятельно рекомендую вам хотя бы рассмотреть возможность пересмотра архитектуры вашего приложения.