在解析XML时如何使XStream将未映射的标签映射到HashMap?

时间:2016-11-24 00:09:13

标签: java xml xstream

有一个我想要转换为Java bean的XML文档。我想将我的bean中缺少的字段标记为hashMap,因为这些字段名称保持不变。有没有办法做到这一点?

例如,我的XML看起来像

<employee>
   <firstname>stack</firstname>
   <lastname>alpha</lastname>
   <phone1>999-999-9999</phone1>
</employee>

我的java bean看起来像

@XstreamAlias("employee")
public class Employee {
       private String firstname;
       private String lastname;
       private map<String, String> unknownfields;
}

当我将XML加载到我的java bean时,它应该看起来像

firstname="stack", lastname="alpha", unknownfields=[{"phone1","999-999-9999"}]

知道这是一个糟糕的设计,但想检查是否可以使用xstream实现。

1 个答案:

答案 0 :(得分:0)

实施您自己的转换器。请查看JavaBeanConverter以获取参考实现,因为您希望尽可能接近。

唯一需要处理不同内容的地方是(在 unmarshal 方法中)

if (propertyExistsInClass) {
    Class<?> type = determineType(reader, result, propertyName);
    Object value = context.convertAnother(result, type);
    beanProvider.writeProperty(result, propertyName, value);
    seenProperties.add(new FastField(resultType, propertyName));
} else {
    throw new MissingFieldException(resultType.getName(), propertyName);
}

else 块中,它会抛出MissingFieldException,您应该填充Map。 XML元素名称在此处很容易获得,但您需要调整值。获取值的线索位于上面的 if 块中:

Object value = context.convertAnother(result, type);

唯一的问题是你没有Java类型来将值转换为。字符串可能吗?

我会继承JavaBeanConverter并覆盖unmarshal方法,但会满足您的需求。