解组要使用XmlAdapter列出的xml元素列表

时间:2019-02-12 06:06:08

标签: java xml java-8 marshalling unmarshalling

我在xml中有如下客户列表

<products>
    <product>
        <name>product1</name>
        <id>c123</id>
            <customer>
                <name>customer1</name>
                <id>c1</id>
                <dob>10/10/23</dob>
                ....
            </customer>
            <customer>
                <name>customer2</name>
                <id>c2</id>
                <dob>10/10/23</dob>
                ....
            </customer>
    </product>
    <product>
        <name>product2</name>
        <id>c123</id>
        <customer>
            <name>customer3</name>
            <id>c3</id>
            <dob>10/10/23</dob>
            ....
        </customer>
        <customer>
            <name>customer4</name>
            <id>c4</id>
            <dob>10/10/23</dob>
            ....
        </customer>
    </product>
</products>

要对此进行映射,我有一个自定义对象

public class Product {
   private String name;
   private String id;

   @XmlJavaTypeAdapter (CustomerAdapter.class)
   @XmlElement(name="customer")
   private Map<String, Customer> customerMap;

   setter()/getter()
}

public class Customer {
   private String name;
   private String id;
   private String dob;

   setter()/getter()
}


我需要将其转换为键,其中id是id,Customer作为值的映射,这样从映射中获取客户详细信息比从列表中获取更好。为了进行转换,我写了一个适配器

public class CustomerAdapter extends XmlAdapter<Customer, Map<String, Customer>> {

    Map<String, Customer> customerMap = new HashMap<> ( );

    @Override
    public Map<String, Customer> unmarshal(Customer customer) {
        if (null != customer) {
            tagMap.put (customer.getId ( ), customer);
        }
        return customerMap ;
    }

    @Override
    public PublicationTagDto marshal(Map<String, Customer> customerMap) {
        return customerMap.values ().iterator ().next ();
    }

}

这里的问题是,我正在获取所有产品的所有客户的列表。基本上对于product1我正在获取所有客户1 2 3 4的列表。类似地,对于product 2我正在获取所有树客户1 2 3 4的列表。我需要它product1客户1 2,product 2客户3 4,基本上需要为每个人对象启动CustomerAdapter。这里的问题是CustomerAdapter被初始化一次,我需要为每个产品对象进行初始化。

请在这里帮助。

0 个答案:

没有答案