Я пытаюсь создать HTML-документ, содержащий Javascript, используя Qt XML. Вот соответствующая часть моего кода Qt:
QDomDocument document;
//Create head, body, etc
QDomElement script = document.createElement("script");
script.setAttribute("type", "text/javascript");
body.appendChild(script); //body is the QDomElement representing the <body> tag
QDomText scriptText = document.createTextNode("if(x < 0){\n/*do something*/\n}");
script.appendChild(scriptText);
QFile file("C:\\foo.html");
file.open(QIODevice::WriteOnly);
QTextStream stream(&file);
stream << document.toString();
Проблема в том, что в коде Javascript он экранирует <
персонаж заменяет его <
, давая следующий вывод, который не является допустимым Javascript:
<script type="text/javascript">
if(x < 0){
/*do something*/
}
</script>
Я искал документацию по Qt, но ничего не нашел.
Обходной путь мог бы заменить <
с <
при записи в файл, делая stream << document.toString().replace("<", "<")
, но могут также быть случаи <
за пределами кода Javascript, который я хочу оставить в покое.
Я также могу подумать о нескольких хитростях Javascript, чтобы проверить, является ли число отрицательным, без использования каких-либо специальных символов HTML, как, например, if(String(x).indexOf('-') != -1)
, но я хотел бы знать, есть ли лучший способ сделать это.
Мой вопрос, как мне создать QDomText
объект с текстом, содержащим специальные символы HTML, такие как <
, >
, &
и т. д. без их побега в QDomDocument::toString()
?
Вы можете поместить код JavaScript в раздел CDATA:
QDomElement script = document.createElement("script");
script.setAttribute("type", "text/javascript");
body.appendChild(script);
QString js = "if(x < 0){\n/*do something*/\n}";
QDomCDATASection data = document.createCDATASection(js);
script.appendChild(data);
затем удалите нежелательный текст сразу после:
QString text = document.toString();
text.replace("<![CDATA[", "\n");
text.replace("]]>", "\n");
Других решений пока нет …