gpt4 book ai didi

java - JAXB @XmlJavaTypeAdapter 用法

转载 作者:行者123 更新时间:2023-12-05 00:02:09 25 4
gpt4 key购买 nike

我一直在努力拥有 @XMLJavaTypeAdapter使其按照我的需要工作。我的理解可能有误。请帮助我更好地理解。

要求:
例如:
我有一个带有映射对象列表的传输 XML,如下所示:

<transport>
<mappings>
<product>XXX</product>
<eventName>XXX</eventName>
<destination>XXX</destination>
<destinationType>XXX</destinationType>
</mappings>
</transport>

使用 JAXB,我可以将 XML 读取为 List<Mappings>对象。

我想在内存中表示 List<Mappings>作为 Map<String,Mappings> ,其中 map 中的键是 product:eventName 和 Use in my code Map 而不是 List<Mapping> .

我对 @XmlJavaTypeAdapter 的用法有点困惑并且无法弄清楚我如何才能做到这一点。

在这方面的任何帮助将不胜感激。

谢谢
拉吉

最佳答案

注:我是EclipseLink JAXB (MOXy)领导和成员JAXB 2 (JSR-222)专家组。

您可以利用 @XmlPath在 MOXy 中扩展以执行以下操作:

交通
Transport类使用 @XmlPath延期。无 @XmlPath一个名为 mappings 的分组元素将被添加到文档中。

package forum8403623;

import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Transport {

@XmlJavaTypeAdapter(MappingsAdapter.class)
@XmlPath(".")
private Map<String, Mapping> mappings = new HashMap<String, Mapping>();

}

制图
package forum8403623;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"product", "eventName", "destination", "destinationType"})
public class Mapping {

String product;
String eventName;
String destination;
String destinationType;

}

映射适配器

以下类负责转换到/从 Map<String, Mapping>到我们将用于 XML 映射的表示。
package forum8403623;

import java.util.*;
import java.util.Map.Entry;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MappingsAdapter extends XmlAdapter<MappingsAdapter.AdaptedMap, Map<String, Mapping>>{

@Override
public Map<String, Mapping> unmarshal(AdaptedMap v) throws Exception {
Map<String, Mapping> mappings = new HashMap<String, Mapping>();
for(Mapping mapping : v.mappings) {
mappings.put(mapping.product, mapping);
}
return mappings;
}

@Override
public AdaptedMap marshal(Map<String, Mapping> v) throws Exception {
AdaptedMap adaptedMap = new AdaptedMap();
for(Entry<String,Mapping> entry : v.entrySet()) {
adaptedMap.mappings.add(entry.getValue());
}
return adaptedMap;
}

static class AdaptedMap {
public List<Mapping> mappings = new ArrayList<Mapping>();
}
}

演示
package forum8403623;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Transport.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8403623/input.xml");
Transport transport = (Transport) unmarshaller.unmarshal(xml);

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(transport, System.out);
}

}

jaxb.properties

要将 MOXy 用作您的 JAXB 提供程序,您需要在与域模型相同的包中添加一个名为 jaxb.properties 的文件,其中包含以下条目:
javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory

更多信息
  • http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html
  • http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html
  • http://blog.bdoughan.com/2010/07/xpath-based-mapping.html
  • 关于java - JAXB @XmlJavaTypeAdapter 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403623/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com