Dom4j解析kml (字符串,文件两种方式)

准备工作

jar 包

dom4j-2.0.3.jar
hutool-all-5.7.12.jar
gson-2.8.0.jar

kml 文件

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <Folder>
            <name>系统默认任务</name>
            <Placemark>
                <Style>
                    <IconStyle>
                        <Icon>
                            <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <color>ffffffff</color>
                        <scale>1</scale>
                    </IconStyle>
                </Style>
                <OvAttr>
                    <OvIcon>4</OvIcon>
                    <OvIconNum>0</OvIconNum>
                    <OvAttaList>
                        <OvAttaItem>d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg</OvAttaItem>
                        <OvAttaItem>edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg</OvAttaItem>
                        <OvAttaItem>2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4</OvAttaItem>
                    </OvAttaList>
                </OvAttr>
                <name>A1</name>
                <Point>
                    <coordinates>122.90521628553613,27.703774764680027,0</coordinates>
                </Point>
            </Placemark>
            <Placemark>
                <Style>
                    <IconStyle>
                        <Icon>
                            <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <color>ffffffff</color>
                        <scale>1</scale>
                    </IconStyle>
                </Style>
                <OvAttr>
                    <OvIcon>4</OvIcon>
                    <OvIconNum>0</OvIconNum>
                    <OvAttaList>
                        <OvAttaItem>3e4da924-4158-4f84-9dde-61765835e4ab.jpg</OvAttaItem>
                        <OvAttaItem>17ed3394-f384-410f-a67d-f17e68e1bacd.jpg</OvAttaItem>
                    </OvAttaList>
                </OvAttr>
                <name>A2</name>
                <Point>
                    <coordinates>121.92842338001357,27.683479318586112,0</coordinates>
                </Point>
            </Placemark>
            <Placemark>
                <Style>
                    <IconStyle>
                        <Icon>
                            <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
                        </Icon>
                        <color>ffffffff</color>
                        <scale>1</scale>
                    </IconStyle>
                </Style>
                <OvAttr>
                    <OvIcon>4</OvIcon>
                    <OvIconNum>0</OvIconNum>
                    <OvAttaList>
                        <OvAttaItem>f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg</OvAttaItem>
                        <OvAttaItem>bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg</OvAttaItem>
                    </OvAttaList>
                </OvAttr>
                <name>A3</name>
                <Point>
                    <coordinates>122.95213066064754,27.676302134985708,0</coordinates>
                </Point>
            </Placemark>
        </Folder>
    </Document>
</kml>

Bean

BackendProject

package com.company.kmldemo;

/**
 * @author bfsz
 * @version 1.0
 * @description: TODO
 * @date 2021/9/22 15:53
 */
public class BackendProject {

    private String uuid;
    private String projectName;
    private String projectDesc;
    private String projectUrl;
    private int version;
    private int deleted;
    private String mapJson;
    private boolean isDefault;
    private String createTime;
    private String updateTime;

    public BackendProject(String uuid, String projectName, String projectDesc, String projectUrl, int version, int deleted, String mapJson, boolean isDefault, String createTime, String updateTime) {
        this.uuid = uuid;
        this.projectName = projectName;
        this.projectDesc = projectDesc;
        this.projectUrl = projectUrl;
        this.version = version;
        this.deleted = deleted;
        this.mapJson = mapJson;
        this.isDefault = isDefault;
        this.createTime = createTime;
        this.updateTime = updateTime;
    }

    // =========================================================================

    public BackendProject(String projectName, String projectDesc) {
        this.projectName = projectName;
        this.projectDesc = projectDesc;
    }

    public BackendProject() {}

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public String getProjectName() {
        return projectName;
    }

    public void setProjectName(String projectName) { this.projectName = projectName; }

    public String getProjectDesc() {
        return projectDesc;
    }

    public void setProjectDesc(String projectDesc) { this.projectDesc = projectDesc; }

    public String getProjectUrl() {
        return projectUrl == null ? "" : projectUrl;
    }

    public void setProjectUrl(String projectUrl) { this.projectUrl = projectUrl; }

    public int getVersion() {
        return version;
    }

    public int getDeleted() {
        return deleted;
    }

    public String getMapJson() {
        return mapJson;
    }

    public void setMapJson(String mapJson) {
        this.mapJson = mapJson;
    }

    public boolean isDefault() {
        return isDefault;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) { this.createTime = createTime; }

    public String getUpdateTime() {
        return updateTime == null ? "" : updateTime;
    }

    public void setVersion(int version) { this.version = version; }

    public void setDeleted(int deleted) { this.deleted = deleted; }

    public void setDefault(boolean aDefault) { isDefault = aDefault; }

    public void setUpdateTime(String updateTime) { this.updateTime = updateTime; }

    @Override
    public String toString() { return JsonManager.getInstance().gson().toJson(this); }


}

MapData

package com.company.kmldemo;

import java.util.ArrayList;
import java.util.List;

/**
 * @author bfsz
 * @version 1.0
 * @description: TODO
 * @date 2021/9/22 16:12
 */
public class MapData {
    private ArrayList<Point> points;
    private ArrayList<Line> lines;

    public List<Point> getPoints() {
        return points;
    }

    public List<Line> getLines() {
        return lines;
    }

    public void setPoints(ArrayList<Point> points) {
        this.points = points;
    }

    public void setLines(ArrayList<Line> lines) {
        this.lines = lines;
    }

    @Override
    public String toString() {
        return JsonManager.getInstance().gson().toJson(this);
    }

    public static class Point {
        private String uuid;
        private String name;
        private String description;
        private Coordinate coordinate;
        private ArrayList<File> files;

        public String getUuid() {
            return uuid;
        }

        public String getName() {
            return name;
        }

        public String getDescription() {
            return description;
        }

        public Coordinate getCoordinate() {
            return coordinate;
        }

        public ArrayList<File> getFiles() {
            return files;
        }

        public void setUuid(String uuid) {
            this.uuid = uuid;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public void setCoordinate(Coordinate coordinate) {
            this.coordinate = coordinate;
        }

        public void setFiles(ArrayList<File> files) {
            this.files = files;
        }

        @Override
        public String toString() {
            return JsonManager.getInstance().gson().toJson(this);
        }
    }

    public static class Line {
        private String name;
        private String description;
        private ArrayList<Coordinate> coordinates;
        private ArrayList<File> files;

        public String getName() {
            return name;
        }

        public String getDescription() {
            return description;
        }

        public ArrayList<File> getFiles() {
            return files;
        }

        @Override
        public String toString() {
            return JsonManager.getInstance().gson().toJson(this);
        }
    }

    public static class Coordinate {
        private double lat;
        private double lng;

        public double getLat() {
            return lat;
        }

        public double getLng() {
            return lng;
        }

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

        public void setLng(double lng) {
            this.lng = lng;
        }

        @Override
        public String toString() {
            return JsonManager.getInstance().gson().toJson(this);
        }
    }

    public static class File {
        private String type; // image, video
        private String name;
        private String localPath;
        private String path;
        private String date;

        public String getType() {
            return type;
        }

        public String getName() {
            return name;
        }

        public String getLocalPath() {
            return localPath;
        }

        public void setLocalPath(String localPath) {
            this.localPath = localPath;
        }

        public String getPath() {
            return path;
        }

        public void setPath(String path) {
            this.path = path;
        }

        public String getDate() {
            return date;
        }

        public void setType(String type) {
            this.type = type;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setDate(String date) {
            this.date = date;
        }

        @Override
        public String toString() {
            return JsonManager.getInstance().gson().toJson(this);
        }
    }
}


Json工具类

package com.company.kmldemo;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
 * @author bfsz
 * @version 1.0
 * @description: TODO
 * @date 2021/9/24 16:50
 */
public class JsonManager {
    private static final JsonManager mInstance = new JsonManager();

    private final Gson mGson;

    public static JsonManager getInstance() {
        return mInstance;
    }

    private JsonManager() {
        mGson = new GsonBuilder()
                .disableHtmlEscaping()
                .create();
    }

    public Gson gson() {
        return mGson;
    }
}

KmlUtil 解析 kml 工具类

package com.company.kmldemo;

import cn.hutool.core.date.DateUtil;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @author bfsz
 * @version 1.0
 * @description: KmlUtil
 * @date 2021/9/22 14:25
 */
public class KmlUtil {
    /**
     * @param file
     * @return
     */
    public static List<BackendProject> kml2projects(File file) {
        SAXReader reader = new SAXReader();
        Document doc = null;
        try {
            doc = reader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return getResultJSON(doc);
    }

    /**
     * @param kmlString
     * @return
     */
    public static List<BackendProject> kml2projects(String kmlString) {
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(kmlString.trim());
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return getResultJSON(doc);
    }

    /**
     * @param doc
     * @return
     */
    private static List<BackendProject> getResultJSON(Document doc) {
        List<BackendProject> projects = new ArrayList<>();

        if (doc == null) {
            return projects;
        }

        List<Element> rootEls = doc.getRootElement().elements();

        for (Element rootEl : rootEls) {
            List<Element> documentEls = rootEl.elements();

            for (Element documentEl : documentEls) {
                if (documentEl.getName().equals("Folder")) {
                    List<Element> folderEls = documentEl.elements();

                    BackendProject project = new BackendProject();
                    MapData mapData = new MapData();

                    ArrayList<MapData.Point> points = new ArrayList<>();
                    ArrayList<MapData.Line> lines = new ArrayList<>();

                    for (Element folderEl : folderEls) {
                        if (folderEl.getName().equals("name")) {
                            project.setProjectName(folderEl.getStringValue());
                        }

                        if (folderEl.getName().equals("Placemark")) {
                            List<Element> placemarkEls = folderEl.elements();

                            ArrayList<MapData.File> filesDTOSList = new ArrayList<>();
                            MapData.Point pointsDTO = new MapData.Point();

                            for (Element placeMarkEl : placemarkEls) {
                                if (placeMarkEl.getName().equals("name")) {
                                    pointsDTO.setName(placeMarkEl.getStringValue());
                                    pointsDTO.setDescription("");
                                    pointsDTO.setUuid(UUID.randomUUID().toString());
                                }

                                if (placeMarkEl.getName().equals("Point")) {
                                    String coordinates = placeMarkEl.element("coordinates").getStringValue().trim();
                                    MapData.Coordinate coordinateDTO = new MapData.Coordinate();
                                    coordinateDTO.setLat(Double.parseDouble(coordinates.split(",")[1]));
                                    coordinateDTO.setLng(Double.parseDouble(coordinates.split(",")[0]));
                                    pointsDTO.setCoordinate(coordinateDTO);
                                }

                                if (placeMarkEl.getName().equals("OvAttr")) {
                                    List<Element> ovAttaList = placeMarkEl.element("OvAttaList").elements();
                                    for (Element ovAttaListE : ovAttaList) {
                                        MapData.File filesDTO = new MapData.File();
                                        String name = ovAttaListE.getStringValue().trim();
                                        String type = name.endsWith("mp4") ? "video" : "image";
                                        filesDTO.setName(name);
                                        filesDTO.setLocalPath(name);
                                        filesDTO.setType(type);
                                        filesDTO.setPath("");
                                        filesDTO.setDate(DateUtil.now());
                                        filesDTOSList.add(filesDTO);
                                    }
                                }

                                pointsDTO.setFiles(filesDTOSList);
                            }

                            points.add(pointsDTO);
                        }
                    }

                    mapData.setPoints(points);
                    mapData.setLines(lines);

                    project.setMapJson(JsonManager.getInstance().gson().toJson(mapData));
                    project.setCreateTime("");
                    project.setProjectDesc("");
                    project.setProjectUrl("");
                    project.setUpdateTime("");
                    project.setUuid("");
                    project.setDefault(false);
                    project.setDeleted(0);
                    project.setVersion(0);

                    projects.add(project);
                }
            }
        }

        return projects;
    }
}

使用

package com.company;


import com.company.kmldemo.KmlUtil;

import java.io.File;

public class Main {
    public static void main(String[] args) {
         // 文件
        List<BackendProject> backendProjects = KmlUtil.kml2projects(new File("E:\\IdeaProjects\\Java-Demo\\src\\com\\company\\kmldemo\\xmls\\kml922.kml"));
        // 字符串
        List<BackendProject> backendProjects1 = KmlUtil.kml2projects("<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml xmlns=\"http://www.opengis.net/kml/2.2\"><Document><Folder><name>系统默认任务</name><Placemark><Style><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href></Icon><color>ffffffff</color><scale>1</scale></IconStyle></Style><OvAttr><OvIcon>4</OvIcon><OvIconNum>0</OvIconNum><OvAttaList><OvAttaItem>d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg</OvAttaItem><OvAttaItem>edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg</OvAttaItem><OvAttaItem>2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4</OvAttaItem></OvAttaList></OvAttr><name>A1</name><Point><coordinates>106.90521628553613,27.703774764680027,0</coordinates></Point></Placemark><Placemark><Style><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href></Icon><color>ffffffff</color><scale>1</scale></IconStyle></Style><OvAttr><OvIcon>4</OvIcon><OvIconNum>0</OvIconNum><OvAttaList><OvAttaItem>3e4da924-4158-4f84-9dde-61765835e4ab.jpg</OvAttaItem><OvAttaItem>17ed3394-f384-410f-a67d-f17e68e1bacd.jpg</OvAttaItem></OvAttaList></OvAttr><name>A2</name><Point><coordinates>106.92842338001357,27.683479318586112,0</coordinates></Point></Placemark><Placemark><Style><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href></Icon><color>ffffffff</color><scale>1</scale></IconStyle></Style><OvAttr><OvIcon>4</OvIcon><OvIconNum>0</OvIconNum><OvAttaList><OvAttaItem>f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg</OvAttaItem><OvAttaItem>bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg</OvAttaItem></OvAttaList></OvAttr><name>A3</name><Point><coordinates>106.95213066064754,27.676302134985708,0</coordinates></Point></Placemark></Folder></Document></kml>");
        System.out.println(backendProjects);
        System.out.println(backendProjects1);
    }
}

结果:

{
    "uuid":"",
    "projectName":"系统默认任务",
    "projectDesc":"",
    "projectUrl":"",
    "version":0,
    "deleted":0,
    "mapJson":"{\"points\":[{\"uuid\":\"e029eef2-aabc-4852-bac8-7e3b242f705a\",\"name\":\"A1\",\"description\":\"\",\"coordinate\":{\"lat\":27.703774764680027,\"lng\":106.90521628553613},\"files\":[{\"type\":\"image\",\"name\":\"d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg\",\"localPath\":\"d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"image\",\"name\":\"edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg\",\"localPath\":\"edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"video\",\"name\":\"2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4\",\"localPath\":\"2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"}]},{\"uuid\":\"b58683fe-64d9-4b91-a237-8336c9b71f69\",\"name\":\"A2\",\"description\":\"\",\"coordinate\":{\"lat\":27.683479318586112,\"lng\":106.92842338001357},\"files\":[{\"type\":\"image\",\"name\":\"3e4da924-4158-4f84-9dde-61765835e4ab.jpg\",\"localPath\":\"3e4da924-4158-4f84-9dde-61765835e4ab.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"image\",\"name\":\"17ed3394-f384-410f-a67d-f17e68e1bacd.jpg\",\"localPath\":\"17ed3394-f384-410f-a67d-f17e68e1bacd.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"}]},{\"uuid\":\"bf7a325e-1e3a-4c97-b51b-792e5cfd6bb4\",\"name\":\"A3\",\"description\":\"\",\"coordinate\":{\"lat\":27.676302134985708,\"lng\":106.95213066064754},\"files\":[{\"type\":\"image\",\"name\":\"f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg\",\"localPath\":\"f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"image\",\"name\":\"bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg\",\"localPath\":\"bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"}]}]}",
    "isDefault":false,
    "createTime":"",
    "updateTime":""
}
Android解析KML文件的步骤如下: 1. 创建SAXParserFactory实例。 2. 创建SAXParser实例。 3. 创建DefaultHandler的子类实例,覆盖startElement()、characters()、endElement()等方法。 4. 调用SAXParser的parse()方法,传入KML文件的InputStream和DefaultHandler实例,开始解析。 5. 在startElement()方法中,可以获取到每个标签的名称和属性值。 6. 在characters()方法中,可以获取到每个标签中的文本内容。 7. 在endElement()方法中,可以处理当前标签的子标签和属性值。 以下是一个简单的例子,演示如何解析KML文件: ```java public class KmlParser { public static void parse(InputStream inputStream) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { boolean inCoordinates = false; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("coordinates")) { inCoordinates = true; } } public void characters(char[] ch, int start, int length) throws SAXException { if (inCoordinates) { String coords = new String(ch, start, length); // 坐标处理逻辑 inCoordinates = false; } } }; parser.parse(inputStream, handler); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的例子中,我们只处理了KML文件中的coordinates标签,读取其中的坐标信息。如果需要处理其他标签或属性,可以在DefaultHandler子类中覆盖相应的方法进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值