1

我正在尝试使用 Simple XML Framework 将公共 Web 服务中的一些 xml 数据序列化为 java 对象。问题是来自服务的不同方法返回具有不同元素名称的相同概念。例如,方法 A 像这样返回元素 foo

<data><Foo>foo value</Foo></data>

而方法 B 返回

<data><foo>foo value</foo></data>

和方法 C 返回

<data><FOO>foo value</FOO></data>

有没有办法(多名称注释等)将此 xml 反序列化为同一个类和同一个元素?例如,将三个方法的结果反序列化为三个不同“Foo”对象(每个方法一个)中的相同“foo”元素:

@Root(name="data")
public class Foo{
    @Element
    public String foo;
    (...)
}
4

1 回答 1

2

不幸的是,您不能为每个字段设置多个注释,并且@Element只支持一个名称(区分大小写)。作为替代方案,您可以自己反序列化这些字段 - 这是一个如何执行此操作的示例:

@Root(name = "data")
@Convert(FooConverter.class) // Set the converter that's used for serializing / deserializing this class
public class Foo
{
    @Element( name = "foo") // For this solution it doesn't matter what you set here
    public String foo;

    // ...


    /*
     * The converter - Implement the serialization / deserialization here.
     * You don't have to use an inner class here.
     */
    public static class FooConverter implements Converter<Foo>
    {
        @Override
        public Foo read(InputNode node) throws Exception
        {
            Foo f = new Foo();
            InputNode nextNode = node.getNext();

            while( nextNode != null )
            {
                if( nextNode.getName().equalsIgnoreCase("foo") ) // Here you pick-up the node, however it's written
                {
                    f.setFoo(nextNode.getValue());
                }

                nextNode = node.getNext();
            }

            return f;
        }


        @Override
        public void write(OutputNode node, Foo value) throws Exception
        {
            // Not required in this example.
            throw new UnsupportedOperationException("Not supported yet.");
        }

    }
}

示例用法:

String str = "<data><foo>foo value</foo></data>"; // Foo can be written as you like

Serializer ser = new Persister(new AnnotationStrategy()); // Setting the AnnotationStrategy is important!!
Foo f = ser.read(Foo.class, str);

System.out.println(f);

现在不管foo写成fooor FoO- 只要它是一个 foo。

于 2013-11-14T15:56:55.257 回答