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