How to serialize a null string as a single empty tag?

Mic*_*ael 8 java xml simple-framework

I serialize this class using the Simple XML framework:

@Root
public class HowToRenderEmptyTag {
    @Element(required=false)
    private String nullString;
}
Run Code Online (Sandbox Code Playgroud)

I want to get:

<howToRenderNull>
    <nullString/>
</howToRenderNull>
Run Code Online (Sandbox Code Playgroud)

But I get:

<howToRenderNull/>
Run Code Online (Sandbox Code Playgroud)

I have tried assigning an empty string:

@Root
public class HowToRenderEmptyTag {
    @Element(required=false)
    private String emptyString = "";
}
Run Code Online (Sandbox Code Playgroud)

But then I get one opening and one closing tag:

<howToRenderNull>
    <emptyString></emptyString>
</howToRenderNull>
Run Code Online (Sandbox Code Playgroud)

使用XML并且更改客户端超出范围的客户端并没有错误地接受这一点.

关于如何获得单个空标签的任何想法?

oll*_*llo 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;


    // ...
}
Run Code Online (Sandbox Code Playgroud)

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 ;-) */
    }
}
Run Code Online (Sandbox Code Playgroud)

您不必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);
Run Code Online (Sandbox Code Playgroud)

最后的结果是:

<howToRenderEmptyTag>
   <emptyString/>
</howToRenderEmptyTag>
Run Code Online (Sandbox Code Playgroud)

既然你已经使用了两者,我不确定空元素是否需要名称emptyStringnullString但改变它并不是一件大事:-)

  • 我终于得到了你的帮助.要使其工作,需要四个部分:1)@Element标记应该具有required = false.2)fields值应为空String(非null).3)对于空字符串,转换器写入方法应该什么都不做.4)Persister必须在构造时提供AnnotationStrategy. (4认同)