我正在尝试使用 Qt XML 创建一个包含 Javascript 的 HTML 文档。这是我的 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");