При условии, что все сериализованные объекты соответствуют контракту Java-бинов, вы можете воссоздать процесс, которым XML-десериализатор следует, чтобы демонтировать java-объекты, чтобы воссоздать код, который идет с ним.
В золотые дни XML я работал над некоторыми проектами, в которых использовались похожие процессы для генерации кода Java из определений XML.
Исходя из вашей сериализованной модели, вы можете использовать преобразование XSL-T для воссоздания кода, которыйпривести к сериализованным объектам.Этот процесс создаст очень линейный код (как в немодульном), но у вас будет то, что вы ищете.
Пример для начала: Для обработки предоставленного вами XML вы можете использоватьследующее рекурсивное преобразование: скопируйте / вставьте и попробуйте здесь: онлайн 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-сериализации в Java, которое оставлено читателю в качестве упражнения: -)