CData通过xslt与JAXB解组

时间:2016-02-03 15:59:34

标签: java xml xslt jaxb sax

我正在尝试使用xsl转换转换第三方xml,然后使用JAXB将生成的xml转换为java对象。 但有些标记为CDATA的元素内容会丢失。

这是我的样本thirdparty xml

style=expanded

XSL转换

<person>
   <name>aName</name>
</person>

Java Class

<xsl:template match="/">
    <User>
        <personName><xsl:value-of select="//name"/></personName>
        <!-- Saving input xml as CDATA for future ref -->
        <inputXml>
            <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
            <xsl:copy-of select="."/>
            <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
        </inputXml>     
    </User>
</xsl:template>

翻译

@XmlRootElement
public class User{
    @XmlElement
    public String personName;
    @XmlElement
    public String inputXml
}

但是上面的代码将inputXml输出为]]&gt; 。 如果我将CDATA硬编码如下,我就能得到inputXml,但是当我动态生成它时却没有。

    JAXBResult jaxbResult = new JAXBResult(JAXBContext.newInstance(User.class));
    newXslTransformer().transform(new StreamSource(thirdPatyXmlFile), jaxbOutput);
    User user = (User)jaxbResult.getResult();
    System.out.println(user.inputXml);

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

JAXBResultSAXResult因此,转换结果是作为一系列SAX事件发出的,而JAXB unmarshaller使用它们来构造您的User对象。

这是一种有效的技术,可以避免在解组时编写转换和重新分析。

不幸的是,你的CDATA黑客攻击不顺利。 在<inputXml>内,JAXBResult的ContentHandler看到文本"<![CDATA[",然后将整个输入文档作为一系列元素和文本事件,然后是结束文本事件"]]>" - 并使用最后一个作为User.inputXml的值。

似乎您需要转换为内存缓冲区,然后从中解组。