Java 如何使用JAXB和Spring对重复条目的xml进行解组
我必须将Java 如何使用JAXB和Spring对重复条目的xml进行解组,java,xml,spring,jaxb,Java,Xml,Spring,Jaxb,我必须将xml转换为Map。我有以下XML结构: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <Environments> <Environment Name="A" URIPath="http://a.com" /> <Environment Name="B" URIPath="http://b.com" /> <Environment Name="C" URI
xml
转换为Map
。我有以下XML结构:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Environments>
<Environment Name="A" URIPath="http://a.com" />
<Environment Name="B" URIPath="http://b.com" />
<Environment Name="C" URIPath="http://c.com" />
</Environments>
您有两种选择:
1) 用两个字段解组环境
实例的集合:Name
和URIPath
。如果要从集合中创建地图,可以稍后构建地图
2) 使用可从集合中正确创建贴图的自定义
详细说明解决方案#1
此解决方案需要以下类:
class Environments {
@XmlElement(name = "Environment")
public List<Environment> environments;
}
class Environment {
@XmlAttribute(name = "Name")
public String Name;
@XmlAttribute(name = "URIPath")
public String URIPath;
}
详细说明解决方案#2
如果要使用自定义的XmlAdapter
直接获取映射
,则不能使用当前形式的XML输入。必须稍微修改它,以便在其周围放置包装器XML元素。这是必需的,因为在Java中,Map
是类的属性,而
标记只是Map
的包装。修改后的XML示例:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<wrapper>
<Environments>
<Environment Name="A" URIPath="http://a.com" />
<Environment Name="B" URIPath="http://b.com" />
<Environment Name="C" URIPath="http://c.com" />
</Environments>
</wrapper>
其中打印:
{A=http://a.com, B=http://b.com, C=http://c.com}
通常,当您对字段进行注释,并且字段也有匹配的getter和setter时,会出现该错误。框架将处理字段和属性(getter/setter)以及属性。您可以注释getter而不是字段,也可以使用
@xmlacessortype(xmlacesstype.field)
更新了我的答案来注释类。发布的示例是工作代码。您得到的错误很可能是因为添加了getter/setter,这就是JAXB抱怨您有多个同名属性的原因。这些是正在工作的枫树。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<wrapper>
<Environments>
<Environment Name="A" URIPath="http://a.com" />
<Environment Name="B" URIPath="http://b.com" />
<Environment Name="C" URIPath="http://c.com" />
</Environments>
</wrapper>
class EnvironmentMap {
@XmlJavaTypeAdapter(value = EnvMapAdapter.class)
@XmlElement(name = "Environments")
public Map<String, String> envMap;
}
class Environments {
@XmlElement(name = "Environment")
public List<Environment> environments;
}
class Environment {
@XmlAttribute(name = "Name")
public String name;
@XmlAttribute(name = "URIPath")
public String uriPath;
}
class EnvMapAdapter extends XmlAdapter<Environments, Map<String, String>> {
@Override
public Map<String, String> unmarshal(Environments envs) throws Exception {
Map<String, String> map = new HashMap<>();
for (Environment env : envs.environments)
map.put(env.name, env.uriPath);
return map;
}
@Override
public Environments marshal(Map<String, String> map) throws Exception {
Environments environments = new Environments();
// This method is only called if you marshal (Java -> XML)
environments.environments = new ArrayList<>(map.size());
for (Entry<String, String> entry : map.entrySet()) {
Environment e = new Environment();
e.name = entry.getKey();
e.uriPath = entry.getValue();
environments.environments.add(e);
}
return environments;
}
}
EnvironmentMap envMap = JAXB.unmarshal(new File("env2.xml"),
EnvironmentMap.class);
System.out.println(envMap.envMap);
{A=http://a.com, B=http://b.com, C=http://c.com}