【问题标题】:How to make XStream map unmapped tags to an HashMap when parsing XML?解析 XML 时如何使 XStream 将未映射的标签映射到 HashMap?
【发布时间】:2017-04-08 03:42:36
【问题描述】:

有一个要转换为 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 来实现。

【问题讨论】:

    标签: java xml xstream


    【解决方案1】:

    实现您自己的转换器。查看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 方法,但可以满足您的需求。

    【讨论】:

    • 谢谢苏米克。明白你的暗示。会试一试的。
    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2014-07-12
    • 2017-05-04
    • 1970-01-01
    • 2011-04-13
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多