处理Stax和jaxb中的CData

时间:2014-06-04 12:31:16

标签: java xml spring jaxb

我正在尝试在Spring StaxtItemWriter和Jaxb marshaller中编写包含CData元素的XML片段。但输出是:

  • 不包裹<![CDATA[ ... ]]>
  • 或转义:<>替换为&lt;&gt;

首先,项目编写者:

<bean id="userAuthorizationErrorItemWriter"
    class="org.springframework.batch.item.xml.StaxEventItemWriter">
    <property name="rootTagName" value="UserAuthorizationEvent" />
    <property name="rootElementAttributes">
        <map>
            <entry key="xmlns:xsi" value="http://www.w3.org/2001/XMLSchema-instance" />
        </map>
    </property>
    <property name="marshaller" ref="userAuthorizationTypeMarshaller" />
    <property name="overwriteOutput" value="true" />
    <property name="resource" value="file://C:/TEMP/fichierOUT.xml" />
    <property name="transactional" value="false" />
</bean>

然后JAXB marshaller

<bean id="userAuthorizationTypeMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.usecase1.xsd.model"/>
</bean>

java类(简化):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "UserAuthorizationType", propOrder = {"action"})
@XmlRootElement(name = "UserAuthorization")
public class UserAuthorizationType {

    @XmlElement(name = "Action", required = true)
    protected String action;

    public String getAction() {
        return action;
    }

    public void setAction(String value) {
        this.action = value;
    }
}

写入文件时,我希望将Action值封装到<![CDATA[ ... ]]>块中。

我尝试使用返回的@XmlJavaTypeAdapter(Adapter1.class)

public String marshal(String value) {
    return "<![CDATA[" + value + "]]>";
}

但是输出被转义:

<UserAuthorization><Action>&lt;![CDATA[first, second, third]]&gt;</Action></UserAuthorization>

你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您必须创建自定义XML编组程序并注册应作为CDATA输出的元素。看看此示例是否有助于https://jaxb.java.net/faq/JaxbCDATASample.java