【问题标题】:Pretty format of XML generated by Simple (Java Lib)Simple 生成的漂亮 XML 格式(Java Lib)
【发布时间】:2012-04-15 15:16:02
【问题描述】:

我遇到了可读性和跨平台问题。

我们使用某些类和子类即时生成我们的 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>

我知道类名不会有冲突,我可以使用的一个选项是简单的搜索和替换脚本,但也许有一个选项可以配置“简单”以导出如上所示的内容。

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

感谢您提供任何帮助或解决方法, 克里斯

【问题讨论】:

    标签: java xml serialization


    【解决方案1】:

    像往常一样,在写完它并返回文档后,我找到了它:-)
    这是教程页面上的最后一个条目,在我的示例中,这可以解决问题:
    EDIT 这不适用于一个以上的元素,不要问我为什么要 EDIT

      @ElementListUnion({@ElementList(entry = "StringObject", type = StringObject.class)})
      private ArrayList<T> _items = new ArrayList<T>();
    

    我使用的解决方案有点复杂,但可以完成工作。我将在此处发布源代码,为您指明正确的方向(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());
            }
    
        }
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多