我知道这个问题可能看起来有点奇怪,但我想确定一下。 我的一位上级相信有一种或多或少简单的方法可以将对象的 XML 序列化转换回创建它的 Java 代码。然而,我很确定我能得到的最好的就是对象。
所以基本上我的问题是:有没有办法转换这样的东西
<java version="1.6.0_10" class="java.beans.XMLDecoder">
<object class="javax.swing.JPanel">
<void property="size">
<object class="java.awt.Dimension">
<int>42</int>
<int>23</int>
</object>
</void>
</object>
</java>
回到类似的东西
JPanel jPanel = new JPanel();
jPanel.setSize(42,23);
提前致谢。
最佳答案
假设所有序列化对象都遵守 java bean 契约,您可以重新创建 XML 反序列化器解码 java 对象所遵循的过程,以便重新创建随之而来的代码。
回到 XML 的黄金时代,我参与了一些项目,这些项目使用类似的过程从 XML 定义生成 Java 代码。
从您的序列化模型出发,您可以使用 XSL-T 转换来重新创建导致序列化对象的代码。此过程将创建非常线性的代码(如在非模块化中),但您将拥有您正在寻找的东西。
入门示例:要处理您提供的 XML,您可以使用以下递归转换:复制/粘贴并在此处尝试:online XSL-T (该模板基于Xpath 1.0,以便能够使用在线工具。Xpath 2.0 将在某些方面改进代码,例如字符串函数)
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xf="http://www.w3.org/2005/xpath-functions">
<xsl:template match="object">
<xsl:call-template name="objectClass" /> <xsl:value-of select="string(' ')" />
<xsl:call-template name="objectNodeName" />
= new <xsl:call-template name="objectClass" />(<xsl:call-template name="objectParams" />);
<xsl:for-each select="*[@property]">
<xsl:apply-templates />
<xsl:call-template name="setProperty" />
</xsl:for-each>
</xsl:template>
<xsl:template match="/" >
<xsl:apply-templates match="/object" />
</xsl:template>
<xsl:template match="text()" />
<xsl:template name="objectNodeName">
<xsl:param name="node" select="." />
<xsl:value-of select="translate($node/@class,'.','_')" />_<xsl:value-of select="count($node/ancestor-or-self::*)" />
</xsl:template>
<xsl:template name="setProperty">
<xsl:call-template name="objectNodeName" > <xsl:with-param name="node" select="parent::node()"/></xsl:call-template>
.set<xsl:call-template name="capitalize"><xsl:with-param name="str" select="@property"/></xsl:call-template>(<xsl:call-template name="objectNodeName" > <xsl:with-param name="node" select="node()"/></xsl:call-template>);
</xsl:template>
<xsl:template name="objectClass">
<xsl:param name="fqn" select="@class" />
<xsl:value-of select="$fqn" />
</xsl:template>
<xsl:template name="objectParams">
<xsl:for-each select="*[not(child::object)]">
<xsl:if test="position() > 1">,</xsl:if><xsl:value-of select="." />
</xsl:for-each>
</xsl:template>
<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
<xsl:template name="capitalize">
<xsl:param name="str" select="." />
<xsl:value-of select="concat(translate(substring($str,1,1),$smallcase,$uppercase),substring($str,2))">
</xsl:template>
</xsl:stylesheet>
免责声明:我在提供的示例及其一些变体上测试了模板,包括一些包含更多对象的模板。我没有测试更深层次的对象嵌套。这是一个例子,不是全功能的 XML Serialization到 Java 转换,留给读者作为练习:-)
关于java - 将 XML 序列化转换回 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6662062/