java - 将 XML 序列化转换回 Java 代码

标签 java code-generation xml-deserialization

我知道这个问题可能看起来有点奇怪,但我想确定一下。 我的一位上级相信有一种或多或少简单的方法可以将对象的 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() &gt; 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/

相关文章:

java - 数组递归练习

java - 使用 java 下载一个大文件,穿过大小限制的防火墙。

Java 全局命名空间访问

java - 加载 XML 非常慢

具有 Name 属性的 C# XML 字符串元素

c# - 反序列化 XML 时绕过特定父节点?

java - 如何避免 Java 中 double 造成的精度损失?

Java:如何将txt文件中的多个句子拆分为数组,然后在数组中搜索单个单词?

java - 生成非常大的 Java 代码

java - 为什么外部类在泛型类型名称中出现两次?