如何使用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周围的单引号生成一个实体。
答案 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)
直接写入基础Writer
或OutputStream
:
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部分),这非常有用。