XStream:反序列化包含同名属性和子元素的XML元素

时间:2015-04-08 13:15:18

标签: java xml xstream xml-deserialization

如何使用XStream成功对其进行反序列化?

<MyElement name="abc">
    <name>foo</name>
    <value>123</name>
    <name>bar</name>
    <value>456</name>
</MyElement>

我已经尝试了以下内容,但是'name'属性没有被反序列化,我最终为该属性返回null。如果我将属性或子'name'元素重命名为其他东西(出于测试目的 - 我无法控制真实数据源),它可以正常工作。

public class MyElement {

    @XStreamAsAttribute
    String name;

    @XStreamImplicit
    @XStreamAlias("name")
    List<String> paramNames;

    @XStreamImplicit
    @XStreamAlias("value")
    List<String> paramValues;

    ...
}

我尝试将此表单用于名称列表,但XStream为我提供了“重复字段名称”例外。 (顺便说一句,任何一种形式都适用于'价值'列表。)

@XStreamImplicit(itemFieldName="name")
List<String> paramNames;

最后,我尝试按如下方式创建自定义转换器,但后来遇到了一个完全不同的问题,即读者无法向我提供顶级元素的属性。相反,当我使用任何reader.getAttribute *方法时,它会提供有关下一个子节点的属性而不是当前节点的信息! (但这是另一回事。)

public class MyElementConverter implements Converter {

    @Override
    public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
        return MyElement.class.equals(type);
    }

    @Override
    public void marshal(Object arg0, HierarchicalStreamWriter arg1,
            MarshallingContext arg2) {
        // Not used, so no implementation
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) {
        MyElement myElement = new MyElement();

        myElement.setName(reader.getAttribute("name"));

        myElement.setParamNames(new ArrayList<String>());
        myElement.setParamValues(new ArrayList<String>());

        while (reader.hasMoreChildren()) {
            reader.moveDown();
            if ("name".equals(reader.getNodeName())) {
                myElement.getParamNames().add(reader.getValue());
            }
            else {
                myElement.getParamValues().add(reader.getValue());
            }
            reader.moveUp();
        }

        return myElement;
    }
}

0 个答案:

没有答案