我正在尝试使用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"><![CDATA[</xsl:text>
<xsl:copy-of select="."/>
<xsl:text disable-output-escaping="yes">]]></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);
任何建议都将不胜感激。
答案 0 :(得分:0)
JAXBResult
是SAXResult
因此,转换结果是作为一系列SAX事件发出的,而JAXB unmarshaller使用它们来构造您的User
对象。
这是一种有效的技术,可以避免在解组时编写转换和重新分析。
不幸的是,你的CDATA黑客攻击不顺利。
在<inputXml>
内,JAXBResult的ContentHandler看到文本"<![CDATA["
,然后将整个输入文档作为一系列元素和文本事件,然后是结束文本事件"]]>"
- 并使用最后一个作为User.inputXml
的值。
似乎您需要转换为内存缓冲区,然后从中解组。