我使用Simple XML框架序列化这个类:
@Root
public class HowToRenderEmptyTag {
@Element(required=false)
private String nullString;
}
我想得到:
<howToRenderNull>
<nullString/>
</howToRenderNull>
但我明白了:
<howToRenderNull/>
我尝试过分配一个空字符串:
@Root
public class HowToRenderEmptyTag {
@Element(required=false)
private String emptyString = "";
}
然后我得到一个开头和一个结束标签:
<howToRenderNull>
<emptyString></emptyString>
</howToRenderNull>
使用XML并且更改客户端超出范围的客户端没有正确接受这一点。
有关如何获取单个空标记的任何想法?
答案 0 :(得分:12)
你可以在这里使用技巧;为你的元素编写一个转换器来改变行为:
HowToRenderEmptyTag
类:@Root(name = "howToRenderEmptyTag")
public class HowToRenderEmptyTag
{
@Element(name = "emptyString", required = false)
@Convert(value = EmptyElementConverter.class) // Set the converter for this element
private String nullString;
// ...
}
EmptyElementConverter
类:public class EmptyElementConverter implements Converter<String>
{
@Override
public String read(InputNode node) throws Exception
{
/* Implement if required */
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void write(OutputNode node, String value) throws Exception
{
/* Simple implementation: do nothing here ;-) */
}
}
您不必为字符串实现此Converter
- 在此示例中,它是可选的。您可以保持该类的通用性或为Object
实现它,以便您可以将它用于任何元素之王。
final File f = new File("test.xml");
HowToRenderEmptyTag example = new HowToRenderEmptyTag("");
Serializer ser = new Persister(new AnnotationStrategy()); // Don't forget AnnotationStrategy here!
ser.write(example, f);
最后结果:
<howToRenderEmptyTag>
<emptyString/>
</howToRenderEmptyTag>
既然你已经使用了两者,我不确定空元素是否需要名称 emptyString 或 nullString ,但改变它并不是一件大事:-)
答案 1 :(得分:0)
您无需创建转换器来解决问题。 你需要做的就是:
<howToRenderNull>
<EmptyNode/>
</howToRenderNull>
是:
@Root
public class HowToRenderEmptyTag {
@Element(name = "emptyNode", required=false)
private EmptyNode emptyNode;
@Root
public static class EmptyNode {}
}
结果:
<howToRenderEmptyTag>
<emptyNode/>
</howToRenderEmptyTag>
干杯! :)