Привет, лор.
Мне нужно вставить XML-документ в одно из полей другого XML-документа. Это не моя прихоть, так требует ТЗ:)
Делаю это так:
// создаю внешний документ
QDomDocument doc;
doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\"" ));
auto item = doc.createElement("item");
doc.appendChild(item);
// создаю вложенный документ
QDomDocument innerDoc;
innerDoc.appendChild(innerDoc.createElement("foo"));
innerDoc.appendChild(innerDoc.createElement("bar"));
// вставляю вложенный документ
QDomText nameText = doc.createTextNode("xml");
item.appendChild(nameText);
Всё получается, вложенный xml эскейпится, но есть проблема. Не эскейпится символ «>». Получается, что xml выглядит вот так:
<?xml version="1.0"?>
<item>
<xml><foo/>
<bar/>
</xml>
</item>
Я даже нашёл баг, посвящённый этой проблеме: https://bugreports.qt.io/browse/QTBUG-16020. Баг старый, закрыт как invalid. Там написано, что такое поведение правильное, и соответствует стандарту XML.
К сожалению, тот софт, который принимает сформированные мной документы, не согласен с этим, и не понимает мои документы. Поэтому нужно как-то это побороть. Если заэскейпить строку вручную, до передачи её в createTextNode(), она эскейпится снова, и получается совсем плохо.
Мне бы помогла какая-нибудь функция в QDom, которая позволяет вставить произвольный текст.
Или может быть можно как-то взять qdom.cpp и qdom.h, скопировать к себе в проект и поправить под себя?
В общем, жду идей.