2012-09-04 37 views
4

我很遺憾地需要生成一些混亂的XML。Scala在PCDATA中嵌入嵌套的XML文檔

主文檔必須包含嵌入的XML文檔。但是,嵌入式文檔發生在CDATA部分。最終的結果應該是這個樣子:

<?xml version="1.0"?> 
<foo> 
    <xml> 
    <![CDATA[ 
     <?xml version="1.0" encoding="UTF-8"?> 
     <bar> 
     </bar> 
    ]]> 
    </xml> 
</foo> 

我遇到了兩個問題:

首先,什麼是CDATA節內的輸出是呈現爲轉義(例如,大於號>&gt;

有沒有辦法在CDATA部分禁用轉義?

其次,我無法創建XML聲明。嘗試包括嵌入式XML文檔時,我收到以下異常:

def serializeEmbedded(): Seq[Node] = { 
    <?xml version="1.0"?> 
    <bar> 
    </bar> 
} 

Exception in thread "main" java.lang.IllegalArgumentException: xml is reserved 
    at scala.xml.ProcInstr.<init>(ProcInstr.scala:25) 

這是我首次涉足Scala的原生XML處理。

謝謝

Saish

回答

5

XML聲明僅適用於序列化真正相關的,並使用Scala的XML文本語法,你不能指定它(如你發現)。

我建議定義一個輔助函數是這樣的:

import scala.xml._ 

def toCData(doc: Elem) = { 
    val w = new java.io.StringWriter 
    XML.write(w, doc, "UTF-8", true, null) 
    PCData(w.toString) 
} 

現在你可以寫,例如:

scala> val doc = <outer>{ toCData(<inner/>) }</outer> 
doc: scala.xml.Elem = 
<outer><![CDATA[<?xml version='1.0' encoding='UTF-8'?> 
<inner></inner>]]></outer> 

這不是優雅,因爲它可以多一點的語言支持,但它的作品。

+0

今天早上我醒了,心裏想:「我只是將這個補丁的東西作爲一個單獨的文檔序列化,並將它包含爲一個字符串。」您的解決方案完美運作用包裝PCData返回的方法是缺少的一步。非常感謝你! – Saish