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

时间:2018-01-27 15:20:40

标签: html c++ qt html-escape-characters qtxml

我正在尝试使用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;在文件中写入时将<替换为stream << document.toString().replace("&lt;", "<"),但在Javascript代码之外可能还会出现&lt;我想独自留下。

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

我的问题是如何创建一个QDomText对象,其中的文字包含<>&等特殊HTML字符,而不会在{{{ 1}}?

1 个答案:

答案 0 :(得分: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");