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

问题描述:

有我想要转换为Java bean的XML文档。我想将我的bean中缺少的字段标记为hashMap,因为这些字段名称不断变化。有没有办法做到这一点?如何在解析XML时使XStream将未映射的标记映射到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实现。

实现您自己的Converter。请参阅JavaBeanConverter以获取参考实现,因为您希望尽可能接近该实现。

你需要以不同的方式处理事情的唯一的地方是这样的(内解组法)

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); 
} 

其中,从其他块时,它抛出MissingFieldException,你应该填充您的Map。 XML元素名称很容易在这里获得,但您需要调整该值。拿到价值的线索是在如果块略高于:

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

唯一的问题是你没有一个Java类型值转换为。字符串也许?

我会继承JavaBeanConverter,只是覆盖unmarshal方法,但适合您的需求。

+0

谢谢Soumik。理解你的提示。会试试看。 – Pals