2011-09-24 124 views
2

我有,我有這樣的XMLJAXB編組和解組CDATA

<programs> 
    <program> 
     <name>test1</name> 
     <instr><![CDATA[ some string ]]></instr> 
    </program> 
    <program> 
     <name>test2</name> 
     <instr><![CDATA[ some string ]]></instr> 
    </program> 
</programs> 

我的程序需要解組這JAXB,做一些處理,最後馬歇爾回XML的要求。當我最終將JAXB對象編組爲xml時,我得到了沒有CDATA前綴的純文本。但爲了保持xml不變,我需要使用CDATA前綴獲取xml。看來JAXB並不直接支持。有沒有辦法做到這一點?

回答

1

CDATA與否,這應該不是問題,因爲如果需要JAXB的輸出將被轉義。

0

注:我是EclipseLink JAXB (MOXy)鉛和JAXB 2(JSR-222)專家組的成員。

您可以使用莫西的@XmlCDATA擴展強制文本節點與CDATA包裹:

package blog.cdata; 

import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.oxm.annotations.XmlCDATA; 

@XmlRootElement(name="c") 
public class Customer { 

    private String bio; 

    @XmlCDATA 
    public void setBio(String bio) { 
     this.bio = bio; 
    } 

    public String getBio() { 
     return bio; 
    } 

} 

更多信息

+0

我想堅持使用JAXB的默認實現。接近解決這個問題的是在http://jaxb.java.net/faq/JaxbCDATASample.java。但XMLSerializer已被棄用,需要尋找替代方案。 – DBS

+0

@Blaise Doughan我使用MOXy 2.1.2和XmlCDATA是未知的。我在我的類路徑中使用了4個JAR,用於MOXy:'org.eclipse.persistence.antlr-2.1.2.jar,org.eclipse.persistence.asm-2.1.2.jar,org.eclipse.persistence.core-2.1.2 .jar,org.eclipse.persistence.moxy-2.1.2.jar' – basZero

+1

@basZero - 在EclipseLink MOXy 2.2中添加了@ XmlCDATA。目前的版本是2.4.1。 –

1

我也遇到了同樣的問題,同時看着我發現這篇文章。由於我使用xjc生成我的bean,因此我不想在生成的代碼中添加@XmlCData。

找了一段時間一個很好的解決方案後,我終於找到了這個帖子:http://javacoalface.blogspot.pt/2012/09/outputting-cdata-sections-with-jaxb.html

其中包含以下示例代碼:

DocumentBuilderFactory docBuilderFactory = 
DocumentBuilderFactory.newInstance(); 
Document document = 
docBuilderFactory.newDocumentBuilder().newDocument(); 

// Marshall the feed object into the empty document. 
jaxbMarshaller.marshal(jaxbObject, document); 

// Transform the DOM to the output stream 
// TransformerFactory is not thread-safe 
StringWriter writer = new StringWriter(); 
TransformerFactory transformerFactory = 
TransformerFactory.newInstance(); 
Transformer nullTransformer = transformerFactory.newTransformer(); 
nullTransformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
nullTransformer.setOutputProperty(
OutputKeys.CDATA_SECTION_ELEMENTS, 
"myElement myOtherElement"); 
nullTransformer.transform(new DOMSource(document), 
new StreamResult(writer)); 

它工作得對我很好。希望它能幫助那些登陸本頁面的人尋找同樣的東西。

+0

工程就像一個魅力!恕我直言最好的選擇,因爲它不需要MOXy並在指定的元素中注入CDATA(而不是定製序列化器類的解決方案)。 @YMomb:JAXB將轉義字符串中的任何XML內容,但有時您更喜歡在標記中使用xml格式的字符串,以便可以輕鬆地複製粘貼。 – Kangur

+0

@Kangur:很高興我能幫上忙。 – pabrantes