3

我的一门课程中有以下代码:

@Text(required=false)
@ElementListUnion({
    @ElementList(required = false, inline = true, type = com.company.Child.class, entry="values")
})
public List<Object> valueUnion;

请注意,这似乎是让框架处理包含子元素和文本的元素的唯一方法。当存在文本并且元素列表也包含元素时,这非常有用,并生成以下 xml:

<parent>
    <values>val 1</values>
    <values>val 2</values>
    some text
</parent>

但是,有时元素列表不包含任何元素,只有文本存在(意味着 valueUnion 列表仅包含一个元素,即文本字符串)。但是,这会产生以下 XML:

<parent>
    <values />
    some text
</parent>

这就是问题所在,因为这会导致服务器阻塞空<values />标签。不幸的是,我无法控制服务器上的代码,如果元素列表不包含任何元素,我正在寻找一种强制 Simple 忽略空标记的方法。

4

1 回答 1

2

我有一个解决方法给你。它并不漂亮,但这个概念可以帮助你。您可以使用序列化对象
的自定义来代替元素注释。Converter

  • Example班级:

(包含您需要的列表、文本和其他元素)

@Root(name="parent")
@Convert(ExampleConverter.class)
public class Example
{
    private String text; // Save the text you want to set ('some text' in your code)
    private List<Object> valueUnion;

    // Constructor + getter / setter
}

实际上你只需要这里的@Convert(ExampleConverter.class)@Root注解,因为序列化是在你自己的转换器(ExampleConverter)中完成的。

  • ExampleConverter班级:

(在此处序列化/反序列化您的对象)

public class ExampleConverter implements Converter
{
    @Override
    public Object read(InputNode node) throws Exception
    {
        /* TODO: Deserialize your class here (if required). */
        throw new UnsupportedOperationException("Not supported yet.");
    }


    @Override
    public void write(OutputNode node, Object value) throws Exception
    {
        final Example val = (Example) value;
        final List<Object> l = val.getValueUnion();

        if( !l.isEmpty() ) // if there are elements, insert their nodes
        {
            for( Object obj : l )
            {
                node.getChild("values").setValue(obj.toString());
            }
        }
        else
        {
            node.getChild("values").setValue(""); // this creates <values></values> if list is empty
        }
        node.setValue(val.getText()); // Set the text (1)
    } 
}

(1):即使有其他元素,这也会设置您的文本。但是,此解决方案可能会破坏您的格式;文本和结束标签将在同一行。您可以通过插入新行来解决此问题。

  • 用法:

创建一个序列化程序,设置您的策略并写入/读取

Serializer ser = new Persister(new AnnotationStrategy()); // 'AnnotationStrategy is important here!
ser.write(...); // write / read
  • 例子:

使用列表中的元素:

Example t = new Example();
t.setText("abc"); // Set the text
t.getValueUnion().add("value1"); // Add some elements to list
t.getValueUnion().add("value2");

Serializer ser = new Persister(new AnnotationStrategy());
ser.write(t, f); // 'f' is the file to write

输出:

<parent>
   <values>value1</values>
   <values>value2</values>abc</parent>

列表中没有元素:

Example t = new Example();
t.setText("abc"); // Set the text

Serializer ser = new Persister(new AnnotationStrategy());
ser.write(t, f); // 'f' is the file to write

输出:

<parent>
   <values></values>abc</parent>

请注意前面所说的格式化“问题”!

于 2013-01-22T12:21:43.433 回答