Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAXB编组和解编CDATA_Jaxb_Marshalling_Cdata - Fatal编程技术网

JAXB编组和解编CDATA

JAXB编组和解编CDATA,jaxb,marshalling,cdata,Jaxb,Marshalling,Cdata,我有一个需求,我有这样的XML <programs> <program> <name>test1</name> <instr><![CDATA[ some string ]]></instr> </program> <program> <name>test2</name> <instr>

我有一个需求,我有这样的XML

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

测试1
测试2

我的程序需要将其解组到JAXB,进行一些处理,最后返回到xml。当我最终将JAXB对象整理成xml时,我得到的是没有CDATA前缀的纯文本。但是为了保持xml的完整性,我需要使用CDATA前缀将xml取回。JAXB似乎没有直接支持这一点。有没有办法做到这一点

无论CDATA与否,这应该不是问题,因为JAXB的输出将在需要时转义。

注意:我是JAXB 2()专家组的负责人和成员

您可以使用MOXy的
@xmlcata
扩展来强制使用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;
   }

}
了解更多信息


我也有同样的问题,在查找时,我找到了这篇文章。因为我使用xjc生成bean,所以我不想在生成的代码中添加@XmlCData

在寻找了一个好的解决方案之后,我终于找到了这篇帖子:

其中包含以下示例代码:

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));

这对我来说很好用。希望它能帮助其他人找到与我相同的东西。

我希望坚持JAXB的默认实现。一个接近于解决这个问题的方法是。但XMLSerializer已被弃用,需要找到替代方案。@Blaise Doughan我使用MOXy 2.1.2,XmlCDATA未知。我在MOXy的类路径上使用了4个jar:
org.eclipse.persistence.antlr-2.1.2.jar,org.eclipse.persistence.asm-2.1.2.jar,org.eclipse.core-2.1.2.jar,org.eclipse.persistence.MOXy-2.1.2.jar
@basZero-EclipseLink MOXy 2.2中添加了
@xmlcata
。当前版本是2.4.1。@basZero-是的,应该只是一个临时替代品。@basZero-您可以在这个链接上获得捆绑包:就像一个符咒一样工作!IMHO是最佳选择,因为它不需要MOXy,并且在指定元素中注入CDATA(而不是自定义序列化器类型的解决方案)@YMomb:JAXB将转义字符串中的任何XML内容,但有时您更喜欢在标记中包含XML格式的字符串,以便轻松复制粘贴。@Kangur:很高兴我能提供帮助。