2011-04-04 46 views
0

我正在研究實用方法,該方法允許將XML數據轉換爲格式化的String,並且在您認爲這是一項微不足道的任務之前,請讓我解釋具體的約束我遇到過。將XML數據表示爲可寫的性能高效的方式

輸入數據在轉換開始時不存在。實際上它代表了我可以輸出到任何java.io.Writer實例中的groovy.lang.Writeablejavadoc)實例。方法的簽名如下所示:

static String serializeToString(Writable source) 

我目前的解決方案包括幾個步驟和實際提供預期的結果:

  1. 創建StringWriter,輸出source存在,並轉換爲String
  2. 創建javax.xml.transform.stream.StreamSource例如,基於此字符串(使用StringReader
  3. 創建新的StringWriter實例並將其包裝到javax.xml.transform.stream.StreamResult
  4. 使用javax.xml.transform.Transformer
  5. 實例轉換StringWriterString

雖然解決方案不工作我不使用它的效率足以欣慰進行改造。這種方法將被經常使用,我想優化它。我想避免的,是不必進行沿線多次轉換:

  1. WriteableString(格式化)
  2. StringStreamSource(這意味着數據將被再次解析)
  3. StreamSourceString再次(格式化)

所以,問題是,是否有可能建立管樣的流動,消除不必要的轉換?

更新#1:

爲了給多一點方面,我GPathResult例如使用StreamingMarkupBuilder.bindNode()方法產生Writable實例轉換爲格式的字符串。不幸的是,沒有辦法指定StreamingMarkupBuilder來產生格式化輸出。

更新#2:

我做了實驗依據PipedWriter + PipedReader但實驗實現沒有顯示出這種做法多少速度增益。看起來在這種情況下這不是關鍵問題。

+0

爲什麼要解析剛剛生成的XML字符串? – 2011-04-04 15:47:16

+0

因爲我想獲得格式化輸出(即縮進)和可寫輸出是未格式化的字符串。 – 2011-04-04 15:51:06

+0

所以你想要它是性能高效和漂亮? ;)無法將可寫入內容更改爲漂亮格式? – 2011-04-04 15:53:07

回答

1

不知道「XML數據」究竟是什麼意思,但是您可以直接將SAXSource作爲「尚未完成」的東西來表示,從而繞過「to-string」和「parse-字符串「的步驟。

+0

不幸的是,SAXSource基於InputStream或Reader,而我基本上是用Writer開始的。 – 2011-04-04 17:05:30

+1

不,SAXSource有一個getXMLreader()方法。可以安排它,以便XMLreader的parse()方法開始生成SAX事件。這些事件將直接取決於源對象的內部結構。 – 2011-04-04 20:36:29

+0

每一個,都不可能改變XML生成的方式(請參閱我的文章中的更新#1) – 2011-04-04 20:39:24