Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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—使用FasterXml.Jackson将XML文件解析为映射_Java_Xml_Jackson_Fasterxml - Fatal编程技术网

JAVA—使用FasterXml.Jackson将XML文件解析为映射

JAVA—使用FasterXml.Jackson将XML文件解析为映射,java,xml,jackson,fasterxml,Java,Xml,Jackson,Fasterxml,我有以下XML文件: <?xml version="1.0" encoding="UTF-8"?> <Site xmlns="bla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="0" affiliations="foo" status="OPERATIONAL" color="#DB2253" updateTime="2002-12-17T09:30:47.0Z" name="GFB_0035" sub

我有以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<Site xmlns="bla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  id="0" affiliations="foo" status="OPERATIONAL" color="#DB2253" updateTime="2002-12-17T09:30:47.0Z" name="GFB_0035" subject="GF">
    <location>
        <vertices Lat="41.905889" Lon="12.452019"/>
        <vertices Lat="41.905973" Lon="12.453596"/>
        <vertices Lat="41.905206" Lon="12.453707"/>
        <vertices Lat="41.905058" Lon="12.452109"/>
    </location>
</Site>
但是,当我查看
“location”
字段的内容时,我只有一个顶点,而不是四个(最后一个)

更新: 我得到的map对象看起来像下面的一个:

{id=0, affiliations=foo, status=OPERATIONAL, color=#DB2253, updateTime=2002-12-17T09:30:47.0Z, name=GFB_0035, subject=GF, location={vertices={Lat=41.905058, Lon=12.452109}}}
是否有一种方法可以使用
FasterXml.Jackson
获取所有四个条目?

根据-

地图不能包含重复的键;每个键最多可以映射到一个值

这就是为什么当你查看“位置”字段的内容时,你只有一个顶点而不是四个(最后一个)

我认为您应该在自己的类中解析XML,而不是将其存储到Map中

参见下面的示例-

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class Stack {


    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {

        String xmlFile = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "<Site xmlns=\"bla\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"  id=\"0\" affiliations=\"foo\""
                + " status=\"OPERATIONAL\" color=\"#DB2253\" updateTime=\"2002-12-17T09:30:47.0Z\" name=\"GFB_0035\" "
                + "subject=\"GF\">"
                + "    <location>"
                + "        <vertices lat=\"41.905889\" lon=\"12.452019\"/>"
                + "        <vertices lat=\"41.905973\" lon=\"12.453596\"/>"
                + "        <vertices lat=\"41.905206\" lon=\"12.453707\"/>"
                + "        <vertices lat=\"41.905058\" lon=\"12.452109\"/>"
                + "    </location>"
                + "</Site>";

        XmlMapper mapper = new XmlMapper();
        SiteData site = mapper.readValue(xmlFile, SiteData.class);
        System.out.println(site);
    }

}
LocationData.java

import java.util.List;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;

public class LocationData {

    @JacksonXmlElementWrapper(useWrapping=false)
    private List<VerticesData> vertices;

    public List<VerticesData> getVertices() {
        return vertices;
    }

    public void setVertices(List<VerticesData> vertices) {
        this.vertices = vertices;
    }

    @Override
    public String toString() {
        return "LocationData [vertices=" + vertices + "]";
    }

}
输出:

Site [id=0, affiliations=foo, status=OPERATIONAL, color=#DB2253, updateTime=2002-12-17T09:30:47.0Z, name=GFB_0035, subject=GF, locations=LocationData [vertices=[Vertices [lat=41.905889, lon=12.452019], Vertices [lat=41.905973, lon=12.453596], Vertices [lat=41.905206, lon=12.453707], Vertices [lat=41.905058, lon=12.452109]]]]

您的输出是什么样子的?我已经用我的代码的输出更新了这个问题,该位置是否会包含顶点列表?是的,这就是我建议您编写自定义类并将XML解析到该类的原因。@ZachiShtain见更新的答案,我添加了示例。
import java.util.List;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;

public class LocationData {

    @JacksonXmlElementWrapper(useWrapping=false)
    private List<VerticesData> vertices;

    public List<VerticesData> getVertices() {
        return vertices;
    }

    public void setVertices(List<VerticesData> vertices) {
        this.vertices = vertices;
    }

    @Override
    public String toString() {
        return "LocationData [vertices=" + vertices + "]";
    }

}
public class VerticesData {

    private String lat;

    private String lon;

    public String getLat() {
        return lat;
    }

    public void setLat(String lat) {
        this.lat = lat;
    }

    public String getLon() {
        return lon;
    }

    public void setLon(String lon) {
        this.lon = lon;
    }

    @Override
    public String toString() {
        return "Vertices [lat=" + lat + ", lon=" + lon + "]";
    }

}
Site [id=0, affiliations=foo, status=OPERATIONAL, color=#DB2253, updateTime=2002-12-17T09:30:47.0Z, name=GFB_0035, subject=GF, locations=LocationData [vertices=[Vertices [lat=41.905889, lon=12.452019], Vertices [lat=41.905973, lon=12.453596], Vertices [lat=41.905206, lon=12.453707], Vertices [lat=41.905058, lon=12.452109]]]]