Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JAXB和Spring对重复条目的xml进行解组_Java_Xml_Spring_Jaxb - Fatal编程技术网

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}