0

我正在尝试使用 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 代码中,它转义了<用 替换它的字符&lt;,给出了以下不是有效的 Javascript 的输出:

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

我在 Qt 文档中搜索了解决方案,但没有找到任何解决方案。

一种解决方法可能是在写入文件时通过执行&lt;替换为,但也可能出现我想不理会的 Javascript 代码之外的情况。<stream << document.toString().replace("&lt;", "<")&lt;

我还可以想到一些 Javascript 技巧来检查数字是否为负而不使用任何特殊的 HTML 字符,例如if(String(x).indexOf('-') != -1),但我想知道是否有更好的方法。

我的问题是如何创建一个QDomText包含特殊 HTML 字符(如<>&等)的文本的对象,而不会将它们转义QDomDocument::toString()

4

1 回答 1

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");
于 2018-01-27T23:59:34.247 回答