Как мне не экранировать специальные символы HTML в QDomText?

Я пытаюсь создать 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 он экранирует < персонаж заменяет его &lt;, давая следующий вывод, который не является допустимым Javascript:

<script type="text/javascript">
if(x &lt; 0){
/*do something*/
}
</script>

Я искал документацию по Qt, но ничего не нашел.

Обходной путь мог бы заменить &lt; с < при записи в файл, делая stream << document.toString().replace("&lt;", "<"), но могут также быть случаи &lt; за пределами кода Javascript, который я хочу оставить в покое.

Я также могу подумать о нескольких хитростях Javascript, чтобы проверить, является ли число отрицательным, без использования каких-либо специальных символов HTML, как, например, if(String(x).indexOf('-') != -1), но я хотел бы знать, есть ли лучший способ сделать это.

Мой вопрос, как мне создать QDomText объект с текстом, содержащим специальные символы HTML, такие как <, >, &и т. д. без их побега в QDomDocument::toString()?

-1

Решение

Вы можете поместить код 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");
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]