Simple生成的XML的漂亮格式(Java库)

Simple生成的XML的漂亮格式(Java库),java,xml,serialization,Java,Xml,Serialization,我面临可读性和跨平台问题 我们正在使用某些类和子类动态生成UI。例如,我将使用基本元素而不是UI元素,但我认为问题应该是显而易见的 我是问在Simple中是否有任何配置开关http://simple.sourceforge.net/home.php 以达到预期的效果。如前所述,这关系到另一个平台的可读性,如果我只需要针对JAVA,我就不会关心XML的外观 因此,在我的示例中,我序列化了一个简单的类,结果是: <GuiElementExamples> <LastCreate

我面临可读性和跨平台问题

我们正在使用某些类和子类动态生成UI。例如,我将使用基本元素而不是UI元素,但我认为问题应该是显而易见的

我是问在Simple中是否有任何配置开关http://simple.sourceforge.net/home.php 以达到预期的效果。如前所述,这关系到另一个平台的可读性,如果我只需要针对JAVA,我就不会关心XML的外观

因此,在我的示例中,我序列化了一个简单的类,结果是:

<GuiElementExamples>
   <LastCreated>2012-04-15 16:48:59.813 CEST</LastCreated>
   <NonGuiObject>
      <objectBase class="objects.single.simple.StringObject" _value="">
         <_readonly>false</_readonly>
      </objectBase>
      <objectBase class="objects.single.simple.StringProperty">
         <_items>
            <object class="objects.single.simple.StringObject" _value="Label">
               <_readonly>true</_readonly>
            </object>
            <object class="objects.single.simple.StringObject" _value="">
               <_readonly>false</_readonly>
            </object>
         </_items>
         <_readonly>false</_readonly>
      </objectBase>
   </NonGuiObject>
</GuiElementExamples>
我希望能以手工制作为例,如下所示:

<GuiElementExamples>
   <LastCreated>2012-04-15 16:48:59.813 CEST</LastCreated>
   <NonGuiObject>
      <StringObject _value="">
         <_readonly>false</_readonly>
      </StringObject>
      <StringProperty>
         <_items>
            <StringObject _value="Label">
               <_readonly>true</_readonly>
            </StringObject>
            <StringObject _value="">
               <_readonly>false</_readonly>
            </StringObject>
         </_items>
         <_readonly>false</_readonly>
      </StringProperty>
   </NonGuiObject>
</GuiElementExamples>
我知道类名中不会有冲突,我可以使用一个简单的搜索和替换脚本,但可能有一个选项可以配置simple,以如上所示的方式导出内容

我知道如果不运行前面提到的脚本,就无法反序列化上述格式的内容,因为没有完全限定的类名,simple无法知道要创建哪个对象

感谢您的帮助或解决方案,
克里斯

像往常一样,写完后,回到文档,我发现:- 这是教程页面上的最后一个条目,在我的示例中,这会起到以下作用: 编辑此项不适用于多个元素,请不要问我为什么要编辑

我使用的解决方案稍微复杂一点,但要完成工作。我将在此处发布源代码,为您指出正确的方向ObjectBase是我所有对象的基类,我希望按照上述方式重命名:

public class FormatVisitor implements Visitor
{
    private static ILogger _logger = LogManager.GetLogger(FormatVisitor.class);
    @Override
    public void read(Type type, NodeMap<InputNode> strings) throws Exception
    {

    }

    public void write(Type type, NodeMap<OutputNode> node)
    {
        OutputNode element = node.getNode();


        Class javaType = type.getType();

        if (ObjectBase.class.isAssignableFrom(javaType))
        {
            _logger.Verbose("Old name was " + element.getName());
            element.setName(javaType.getSimpleName());
            _logger.Verbose("Changing name to " + javaType.getSimpleName());
        }

        try
        {
            String className =  element.getAttributes().get("class").getValue();
            Class localClass = Class.forName(className);
            boolean shouldShortenName = ObjectBase.class.isAssignableFrom(localClass);
            if (shouldShortenName)
            {
                element.getAttributes().remove("class");
                element.setName(localClass.getSimpleName());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();  
        }


        if (ObjectBase.class.isAssignableFrom(javaType))
        {
            element.setName(type.getType().getSimpleName());
        }

    }


}
public class FormatVisitor implements Visitor
{
    private static ILogger _logger = LogManager.GetLogger(FormatVisitor.class);
    @Override
    public void read(Type type, NodeMap<InputNode> strings) throws Exception
    {

    }

    public void write(Type type, NodeMap<OutputNode> node)
    {
        OutputNode element = node.getNode();


        Class javaType = type.getType();

        if (ObjectBase.class.isAssignableFrom(javaType))
        {
            _logger.Verbose("Old name was " + element.getName());
            element.setName(javaType.getSimpleName());
            _logger.Verbose("Changing name to " + javaType.getSimpleName());
        }

        try
        {
            String className =  element.getAttributes().get("class").getValue();
            Class localClass = Class.forName(className);
            boolean shouldShortenName = ObjectBase.class.isAssignableFrom(localClass);
            if (shouldShortenName)
            {
                element.getAttributes().remove("class");
                element.setName(localClass.getSimpleName());
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();  
        }


        if (ObjectBase.class.isAssignableFrom(javaType))
        {
            element.setName(type.getType().getSimpleName());
        }

    }


}