如何将空字符串序列化为单个空标记?

时间:2013-06-20 12:13:34

标签: java xml simple-framework

我使用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并且更改客户端超出范围的客户端没有正确接受这一点。

有关如何获取单个空标记的任何想法?

2 个答案:

答案 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>

干杯! :)