我有一个要求,我有这样的XML
<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不直接支持这一点。有没有办法实现这个目标?
答案 0 :(得分:1)
CDATA与否,这应该不是问题,因为如果需要,JAXB的输出将被转义。
答案 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));
它对我来说非常好。希望它可以帮助其他人登陆这个页面寻找同样的东西。
答案 2 :(得分:0)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2(JSR-222)专家组的成员。
您可以使用MOXy的@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;
}
}
了解更多信息