XMLStreamWriter writeCharacters没有转义

Fel*_*lix 5 java xml

如何使用XMLStreamWriter准确写出我输入的内容?例如,如果我创建脚本标记并用javascript填充它,我不希望我的所有单引号都出现为'

这是我写的一个小测试,它没有使用我已经实现的任何抽象,只是调用writeCharacters.

  public void testWriteCharacters() {
    StringWriter sw = new StringWriter();
    XMLOutputFactory factory = XMLOutputFactory.newInstance();

    StringBuffer out = new StringBuffer();
    try {
      XMLStreamWriter writer = factory.createXMLStreamWriter(sw);
      writer.writeStartElement("script");
      writer.writeAttribute("type","text/javascript");
      writer.writeCharacters("function hw(){ \n"+
      "\t alert('hello world');\n" +
      "}\n");
      writer.writeEndElement();
      out.append(sw);
    } catch (XMLStreamException e) {
    } finally {
      try {
        sw.close();
      } catch(IOException e) {
        e.printStackTrace();
      }
    }
    System.out.println(out.toString());
  }
Run Code Online (Sandbox Code Playgroud)

这为围绕hello world的单引号生成了一个实体.

小智 8

你可以在工厂使用一个属性:

final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);
Run Code Online (Sandbox Code Playgroud)

然后,由于工厂支持此属性,由此工厂创建的编写器将编写字符而不转义元素中的文本.XMLOutputFactoryImpl可以.


axt*_*avt 6

XmlStreamWriter.writeCharacters()不逃避'.只逃脱<,>并且&writeAttribute也逃脱"(见的javadoc).

但是,如果您想要编写文本而不进行转义,则必须将其作为一个CDATA部分使用writeCData().

CDATA部分中编写脚本的典型方法是:

<script>//<![CDATA[
    ...
//]]></script>
Run Code Online (Sandbox Code Playgroud)

那是:

out.writeCharacters("//");
out.writeCData("\n ... \n//");
Run Code Online (Sandbox Code Playgroud)