如何不转义 QDomText 中的 HTML 个特殊字符?

How do I not escape HTML special characters in QDomText?

我正在尝试使用 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 文档中搜索了解决方案,但没有找到任何东西。

解决方法是在写入文件时通过执行 stream << document.toString().replace("&lt;", "<")&lt; 替换为 <,但也可能在文件外出现 &lt; 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");