XMLStreamWriter writeCharacters没有转义

时间:2010-05-06 19:12:17

标签: java xml

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

这是我编写的一个小测试,它没有使用我已经实现的任何抽象,只是调用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());
  }

这会为hello world周围的单引号生成一个实体。

5 个答案:

答案 0 :(得分:8)

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

final XMLOutputFactory streamWriterFactory = XMLOutputFactory.newFactory();
streamWriterFactory.setProperty("escapeCharacters", false);

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

答案 1 :(得分:6)

XmlStreamWriter.writeCharacters()无法逃脱'。它只会转义<>&,而writeAttribute也会转义"(请参阅javadoc)。

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

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

<script>//<![CDATA[
    ...
//]]></script>

那是:

out.writeCharacters("//");
out.writeCData("\n ... \n//");

答案 2 :(得分:0)

您也可以使用woodstox的stax实现。他们的XMLStreamWriter2类有一个writeRaw()方法。我们正是出于这个特殊原因而使用它,而且效果很好。

答案 3 :(得分:0)

直接写入基础WriterOutputStream

Writer out = new StringWriter();
XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(out);
... //write your XML
writer.flush();
//write extra characters directly to the underlying writer
out.write("<yourstuff>Test characters</yourstuff>");
out.flush();
... //continue with normal XML
writer.writeEndElement();
writer.flush();

答案 4 :(得分:0)

替代方法,使用自定义转义处理程序:

XMLOutputFactory xmlFactory = XMLOutputFactory.newInstance();
xmlFactory.setProperty(XMLOutputFactory2.P_TEXT_ESCAPER, new MyEscapingWriterFactory());

'MyEscapingWriterFactory'是您对'EscapingWriterFactory'界面的实现。它允许细粒度文本转义控制。当您使用文本元素处理随机输入时(例如,带有多个处理指令的无效XML或错误编写的CDATA部分),这非常有用。