2010-05-06 74 views
4

如何使用XMLStreamWriter準確地寫入我放入的內容?例如,如果我創建script標籤並用javascript填充它,我不希望所有的單引號出現爲&;XMLStreamWriter在不轉義的情況下寫入字符

這是我寫的一個小測試,它不使用任何抽象概念,只是調用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的單引號的apos實體。

+0

可能的重複[如何將未轉義的XML寫入XMLStreamWriter?](http://stackoverflow.com/questions/19998460/how-to-write-unescaped-xml-to-xmlstreamwriter) – Roland 2016-07-18 08:41:11

回答

6

XmlStreamWriter.writeCharacters()不逃脫'。它僅逃脫<,>&,並且writeAttribute也逃脫"(參見javadoc)。

但是,如果您想要寫入文本而沒有任何轉義,則必須使用writeCData()將其編寫爲CDATA部分。

寫入腳本CDATA切片的典型做法是:

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

即:

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

我上面添加了一個示例。它一直在爲我逃避單引號。 CData不會轉義任何東西,但內容不會呈現,並且JavaScript不會執行。思考? – Felix 2010-05-06 21:07:03

+0

@Felix:那麼它似乎是依賴於實現的。我添加了CDATA示例。 – axtavt 2010-05-06 21:54:57

+0

謝謝!這解決了我的問題! – 2011-08-17 20:59:44

8

你可以在工廠使用屬性:

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

然後由該工廠創建的作家將寫入字符而不逃避元素gi中的文本通過工廠支持這個屬性。 XMLOutputFactoryImpl會。

+0

這似乎沒有記錄,但它適用於'writeCharacters'。但是,它確實不適用於'writeAttribute' :-( – binwiederhier 2014-07-17 18:53:02

+0

沒有記錄,所以你不能相信這將在未來工作。查看我的答案:http://stackoverflow.com/a/38374931/480894 – Roland 2016-07-14 13:00:19

0

您還可以使用woodstox的stax實現。他們的XMLStreamWriter2類有一個writeRaw()方法。我們使用它是出於這個特定的原因,它的效果很好。

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(); 
0

替代方法,以定製逃逸處理程序:

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

'MyEscapingWriterFactory' 是你的 'EscapingWriterFactory' 接口的實現。它允許細粒度的文本轉義控制。當您使用文本元素來處理隨機輸入時(例如,具有多個處理指令的無效XML或錯誤地寫入CDATA部分),這很有用。

相關問題