2011-09-24 110 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