【问题标题】:Unmarshalling of XML key-value pair in java objectjava对象中XML键值对的解组
【发布时间】:2020-02-10 21:47:22
【问题描述】:

使用 jaxb 将 XML 键值部分解组到 java 对象中。我试过使用地图适配器,但我做不到。

<ACCOUNT_CHANGES>
    <TYPE value="Active" />
    <RECORD>
        <SUBSCRIPTION>
            <INFO key="aaa">
                <![CDATA[042]]>
            </INFO>
            <INFO key="bbb">
                <![CDATA[45]]>
            </INFO>
            <INFO key="uuid">
                <![CDATA[d9a7e94c-0a9d-c745-82e9-980877cc5043]]>
            </INFO>
            <INFO key="ccc">
                <![CDATA[Active]]>
            </INFO>
            <INFO key="companyname">
                <![CDATA[ltd]]>
            </INFO>
        </SUBSCRIPTION>
    </RECORD>
</ACCOUNT_CHANGES>  

【问题讨论】:

    标签: java xml spring-boot jaxb unmarshalling


    【解决方案1】:

    您可以使用适配器来执行此操作,但据我了解您的要求,这不是必需的。如果您只是想解组为一个对象,而不是一个 Map,您可以执行以下操作:

    从根开始:

    @XmlRootElement(name = "ACCOUNT_CHANGES")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class AccountChanges {
    
        @XmlElement(name = "TYPE")
        private Type type;
    
        @XmlElement(name = "RECORD")
        private Record record;
    
    }
    

    让我们把 Type 排除在外:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Type {
    
        @XmlAttribute
        private String value;
    }
    

    然后记录:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Record {
    
        @XmlElement(name = "SUBSCRIPTION")
        private Subscription subscription;
    }
    

    还有订阅:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Subscription {
    
        @XmlElement(name = "INFO")
        private List<Info> infoList;
    }
    

    Info 将您的键作为属性,然后是一些值。它看起来像这样:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Info {
    
        @XmlAttribute
        private String key;
    
        @XmlValue
        private String value;
    
        public String getKey() {
            return key;
        }
    
        public String getValue() {
            return value;
        }
    }
    

    这将解组您的 xml,并且信息键和值将在字段中。如果您想要地图中的键和值,您可以使用适配器。

    适配器如下所示:

    public class MyMapAdapter extends XmlAdapter<Info, Map<String, String>> {
    
        private HashMap<String, String> hashMap = new HashMap<String, String>();
    
        @Override
        public Map<String, String> unmarshal(Info v) throws Exception {
            hashMap.put(v.getKey(), v.getValue());
            return hashMap;
        }
    
        @Override
        public Info marshal(Map<String, String> v) throws Exception {
            // do here actions for marshalling if u also marshal
            return null;
        }
    }
    

    您将更改订阅以使用适配器并将地图作为字段:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Subscription {
    
        @XmlElement(name = "INFO")
        @XmlJavaTypeAdapter(MyMapAdapter.class)
        private Map<String, String> infoMap;
    }
    

    两种方式,都可以解组您的 xml 有效负载。

    干杯

    【讨论】:

    • 感谢您的详细解释。喜欢适配器方法。
    • @NiladriChanda 乐于助人:)
    猜你喜欢
    • 2012-04-21
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2018-11-01
    • 2014-06-18
    • 2017-07-27
    相关资源
    最近更新 更多