使用MOXy在JAXB中实现动态CDATA

使用MOXy在JAXB中实现动态CDATA,jaxb,eclipselink,cdata,moxy,Jaxb,Eclipselink,Cdata,Moxy,我正在使用。我有一个问题,java类的属性可以是CDATA,也可以不是动态的。比如说, 类嵌入{ //@仅限XmlValue //或@XmlValue@CDATA 私有字符串值;//这可以是CDATA,也可以不是 } 我曾尝试使用继承来解决这个问题,其中一个子类的属性只是一个值,另一个子类的属性是CDATA。这个解决方案的问题是,生成的Xml包含xsi:type和xmlns:xsi信息,这是我不想要的,因为我正在升级遗留代码,并且需要与遗留代码完全相同的结果Xml 我尝试过的解决方案是: @x

我正在使用。我有一个问题,java类的属性可以是CDATA,也可以不是动态的。比如说,

类嵌入{
//@仅限XmlValue
//或@XmlValue@CDATA
私有字符串值;//这可以是CDATA,也可以不是
}
我曾尝试使用继承来解决这个问题,其中一个子类的属性只是一个值,另一个子类的属性是CDATA。这个解决方案的问题是,生成的Xml包含xsi:type和xmlns:xsi信息,这是我不想要的,因为我正在升级遗留代码,并且需要与遗留代码完全相同的结果Xml

我尝试过的解决方案是:

@xmlacessortype(xmlacesstype.FIELD)
@XmlType(name=“itemType”,namespace=”“,propOrder={“嵌入”}
公共类项目{
列表``嵌入;
//二传手
}
@XmlAccessorType(XmlAccessType.NONE)
@XMLSEEALLO(EmbedDefault.class、EmbedasData.class)
嵌入公共抽象类{
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={“值”})
公共类嵌入默认扩展嵌入{
@XmlValue
保护字符串值;
//接球手和接球手
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={“值”})
公共类EmbedAsCdata扩展了嵌入{
@XmlValue
@XmlCDATA
保护字符串值;
//接球手和接球手
}

还有其他更简单的方法吗?

注意:我是专家组的负责人和成员

我正试图为您提供一个合适的解决方案,但下面是一个增强请求,您可以按照这个请求来增强
@xmlcata
注释,使这个用例更易于支持


更新#1

下面是我正在为您的用例开发的一种方法。它需要对MOXy进行一个小的更改,我已经了解到了这一点,但仍然需要进行全面测试。您可以使用以下链接跟踪我们在这个问题上的进展:

DomHandler(CDATA处理程序)

JAXB具有
DomHandler
的概念,允许您对XML的外观进行一些额外的控制。我们将利用
DomHandler
在需要时添加
CDATA

用于UM14145131的包;
导入javax.xml.bind.ValidationEventHandler;
导入javax.xml.bind.annotation.DomHandler;
导入javax.xml.parsers.*;
导入javax.xml.transform.Source;
导入javax.xml.transform.dom.*;
导入org.w3c.dom.*;
公共类CDATA处理程序实现DomHandler{
私有静态DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();;
@凌驾
公共域结果createUnmarshaller(ValidationEventHandler veh){
返回新的DOMResult();
}
@凌驾
公共字符串getElement(DOMResult DOMResult){
Document Document=(Document)domResult.getNode();
返回document.getDocumentElement().getTextContent();
}
@凌驾
公共源封送处理(字符串、ValidationEventHandler-veh){
试一试{
DocumentBuilder db=dbf.newDocumentBuilder();
Document Document=db.newDocument();
节点;
if(string.contains()
嵌入

@XmlJavaTypeAdapter
注释用于指定
XmlAdapter

用于UM14145131的包;
导入javax.xml.bind.annotation.*;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
类嵌入{
@XmlValue
@XmlJavaTypeAdapter(CDATA适配器.class)
私有字符串值;//这可以是CDATA,也可以不是
公共字符串getValue(){
返回值;
}
公共void设置值(字符串值){
这个值=值;
}
}
演示

下面是如何指定
CharacterEscapeHandler
。请注意,这将覆盖此
封送器的所有字符转义。我们这样做是为了使
CDATA
部分不会转义。对于生产代码,此方法的实现需要在本示例中所示的基础上进行增强

用于UM14145131的包;
导入java.io.*;
导入javax.xml.bind.*;
导入org.eclipse.persistence.jaxb.MarshallerProperties;
导入org.eclipse.persistence.oxm.CharacterEscapeHandler;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Embed.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
File xml=新文件(“src/forum14145131/input.xml”);
Embed=(Embed)unmarshaller.unmarshal(xml);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.setProperty(MarshallerProperties.CHARACTER\u ESCAPE\u处理程序,
新字符escapehandler(){
@凌驾
公共无效转义(char[]ac,int i,int j,布尔标志,
Writer(Writer)抛出IOException{
writer.write(ac,i,j);
}
});
marshaller.marshall(嵌入、系统、输出);
}
}
input.xml/Output



感谢您的回复。您可能已经考虑过了,但考虑到上述问题,建议的增强解决方案仍然存在相同的问题。即使我们设置@xmlcata(xmlcatatype.Optional),问题仍然是如何动态识别值是否为CDATA。或者在@xmlcata(xmlcatatype.Optional)时如何决定是否呈现CDATA已使用。再次感谢。@user1946448-没问题。我已经用另一种方法更新了我的答案,但它需要对MOXy进行一个小的更改,我仍然需要对其进行全面测试。为了确定CDATA块的存在,我只想检查一下