解决方案审查:
fred的答案只是一种变通方法,当将Marshaller链接到Schema时,在验证内容时将失败,因为您仅修改字符串文字而不创建CDATA节。因此,如果仅将字符串从foo重写为,则Xerces会将字符串的长度识别为15而不是3。
MOXy解决方案是特定于实现的,不能仅与JDK的类一起使用。
使用getSerializer的解决方案引用了不推荐使用的XMLSerializer类。
解决方案LSSerializer只是一个痛苦。
我使用XMLStreamWriter实现修改了a2ndrade的解决方案。该解决方案效果很好。
XMLOutputFactory xof = XMLOutputFactory.newInstance();
XMLStreamWriter streamWriter = xof.createXMLStreamWriter( System.out );
CDataXMLStreamWriter cdataStreamWriter = new CDataXMLStreamWriter( streamWriter );
marshaller.marshal( jaxbElement, cdataStreamWriter );
cdataStreamWriter.flush();
cdataStreamWriter.close();
多数民众赞成在CDataXMLStreamWriter实现。委托类仅将所有方法调用委托给给定的XMLStreamWriter实现。
import java.util.regex.Pattern;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
/**
* Implementation which is able to decide to use a CDATA section for a string.
*/
public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter
{
private static final Pattern XML_CHARS = Pattern.compile( "[&<>]" );
public CDataXMLStreamWriter( XMLStreamWriter del )
{
super( del );
}
@Override
public void writeCharacters( String text ) throws XMLStreamException
{
boolean useCData = XML_CHARS.matcher( text ).find();
if( useCData )
{
super.writeCData( text );
}
else
{
super.writeCharacters( text );
}
}
}