【问题标题】:XML Parse a documentXML 解析文档
【发布时间】:2020-07-10 03:57:15
【问题描述】:

有谁知道如何解析此文档以在具有属性的 Node 类型的 arrayList 中获取 java 对象: node_id 相关路线 描述 标题 on_finish_routeid on_starting_routeid level_id 航点类型 姓名 隆 纬度

对于信息,它是一个 graphml xml 文档。 例如。

<node id="L08-022">
      <data key="lat">40.69330963</data>
      <data key="lon">-73.98752537</data>
      <data key="name" />
      <data key="waypoint_type">escalator</data>
      <data key="level_id">1080000</data>
      <data key="on_starting_route" />
      <data key="on_finish_route" />
    </node>
    <node id="L08-023">
      <data key="lat">40.69318355</data>
      <data key="lon">-73.98755793</data>
      <data key="name" />
      <data key="waypoint_type">stairs</data>
      <data key="level_id">1080000</data>
      <data key="on_starting_route" />
      <data key="on_finish_route" />
    </node>
    <node id="L08-024">
      <data key="lat">40.69316844</data>
      <data key="lon">-73.98755873</data>
      <data key="name" />
      <data key="waypoint_type">stairs</data>
      <data key="level_id">1080000</data>
      <data key="on_starting_route" />
      <data key="on_finish_route" />
    </node>

我尝试了很多方法,真的需要帮助,我无法得到我需要的信息。

【问题讨论】:

  • 你尝试了哪些方法?你能分享你任何尝试的代码吗?你能描述一下你遇到的任何具体问题吗?这应该有助于你得到一些答案。
  • @andrewjames 我习惯使用 XMLPullParser,其中 xml 中的标签不同,而不是数据密钥对和节点标签本身中的 id,我只是不知道如何解析这个我看过 Blueprints 和 tinkerpop for graphml,但我真的无法理解这一点,并且那里的文档没有帮助。谢谢你来找我
  • 看看JAXBSAX这两种使用Java解析XML的常用方法。写一些代码,尝试一些不同的方法。如果您遇到困难,您可以显示您的代码并提出特定问题(但很有可能已经在此站点上提出并回答了该问题 - 因此请先检查)。希望有帮助!
  • @andrewjames 我看过的所有解析器都依赖于 StartTag End TAG 等。但是,graphml 中的这些标签要么相同,如 或我提到的包含所需的信息,例如 您是否认为我能够通过您建议的实现来实现这一点,因为我一直在努力使用普通的 xml 解析器?如果你有信心我会再去一次,但我已经尝试了很多!非常感谢您的帮助。
  • 绝对 - 可以提取 XML attributes 中的数据。 JAXB 是一个很好的起点。

标签: java xml-parsing xmlpullparser parsexml


【解决方案1】:

您可以为这个特定任务开发自己的小解析器,但是使用 XML 解析器将是一个真正的好主意:

Nodes 类(简单的 Nodes 解析器包含在类中):

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Nodes {

    private String node_ID;
    private double latitude;
    private double longitude;
    private String name;
    private String waypoint_Type;
    private int    level_ID;
    private String on_Starting_Route;
    private String on_Finish_Route;

    // Constructor #1
    public Nodes() { }

    // Constructor #2
    public Nodes(String nodeID, double latitude, double longitude, String name, 
                 String waypointType, int levelID, String startingRoute, 
                 String finishRoute) {
        this.node_ID = nodeID;
        this.latitude = latitude;
        this.longitude = longitude;
        this.name = name;
        this.waypoint_Type = waypointType;
        this.level_ID = levelID;
        this.on_Starting_Route = startingRoute;
        this.on_Finish_Route = finishRoute;
    }

    // Getters and Setters
    public String getNode_ID() {
        return node_ID;
    }

    public void setNode_ID(String node_ID) {
        this.node_ID = node_ID;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

    public String getName() {
        return name;
    }

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

    public String getWaypoint_Type() {
        return waypoint_Type;
    }

    public void setWaypoint_Type(String waypoint_Type) {
        this.waypoint_Type = waypoint_Type;
    }

    public int getLevel_ID() {
        return level_ID;
    }

    public void setLevel_ID(int level_ID) {
        this.level_ID = level_ID;
    }

    public String getOn_Starting_Route() {
        return on_Starting_Route;
    }

    public void setOn_Starting_Route(String on_Starting_Route) {
        this.on_Starting_Route = on_Starting_Route;
    }

    public String getOn_Finish_Route() {
        return on_Finish_Route;
    }

    public void setOn_Finish_Route(String on_Finish_Route) {
        this.on_Finish_Route = on_Finish_Route;
    }

    // Read in Nodes from XML (simple parser)
    public List<Nodes> getNodesFromFile(String filePath) {
        List<Nodes> nodes = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                line = line.trim();
                if (line.equals("")) {
                    continue;
                }
                if (line.toLowerCase().startsWith("<node id=\"")) {
                    String nodeID;
                    double lat = 0.0d;
                    double lon = 0.0d;
                    String name = "";
                    String wayType = "";
                    int levID = 0;
                    String startR = "";
                    String finishR = "";

                    nodeID = line.substring("<node id=\"".length(), line.lastIndexOf("\">"));
                    int count = 0;
                    while ((line = reader.readLine()) != null) {
                        line = line.trim();
                        if (line.equalsIgnoreCase("</node>")) {
                            break;
                        }
                        if (line.equals("")) {
                            continue;
                        }
                        count++;
                        switch (count) {
                            case 1:
                                String la = line.substring((line.contains("<data key=\"lat\">")
                                        ? "<data key=\"lat\">".length() : "<data key=\"lat\"".length()),
                                        (line.contains("</data>") ? line.indexOf("</data>") : line.indexOf("/>")));
                                lat = (la.matches("-?\\d+(\\.\\d+)?") ? Double.parseDouble(la) : 0.0d);
                                break;
                            case 2:
                                String lg = line.substring((line.contains("<data key=\"lon\">")
                                        ? "<data key=\"lon\">".length() : "<data key=\"lon\"".length()),
                                        (line.contains("</data>") ? line.indexOf("</data>") : line.indexOf("/>")));
                                lon = (lg.matches("-?\\d+(\\.\\d+)?") ? Double.parseDouble(lg) : 0.0d);
                                break;
                            case 3:
                                String nm = line.substring((line.contains("<data key=\"name\">")
                                        ? "<data key=\"name\">".length() : "<data key=\"name\"".length()),
                                        (line.contains("</data>") ? line.indexOf("</data>") : line.indexOf("/>")));
                                name = nm.trim().equals("") ? "" : nm;
                                break;
                            case 4:
                                String wt = line.substring((line.contains("<data key=\"waypoint_type\">")
                                        ? "<data key=\"waypoint_type\">".length() : "<data key=\"waypoint_type\"".length()),
                                        (line.contains("</data>") ? line.indexOf("</data>") : line.indexOf("/>")));
                                wayType = wt.trim().equals("") ? "" : wt;
                                break;
                            case 5:
                                String lid = line.substring((line.contains("<data key=\"level_id\">")
                                         ? "<data key=\"level_id\">".length() : "<data key=\"level_id\"".length()),
                                         (line.contains("</data>") ? line.indexOf("</data>") : line.indexOf("/>")));

                                levID = (lid.matches("^-?\\d+$") ? Integer.parseInt(lid) : 0);
                                break;
                            case 6:
                                 String sr = line.substring((line.contains("<data key=\"on_starting_route\">")
                                        ? "<data key=\"on_starting_route\">".length() : "<data key=\"on_starting_route\"".length()),
                                        (line.contains("</data>") ? line.indexOf("</data>") : line.indexOf("/>")));
                                startR = sr.trim().equals("") ? "" : sr;
                                break;
                            case 7:
                                String fr = line.substring((line.contains("<data key=\"on_finish_route\">")
                                        ? "<data key=\"on_finish_route\">".length() : "<data key=\"on_finish_route\"".length()),
                                        (line.contains("</data>") ? line.indexOf("</data>") : line.indexOf("/>")));
                                finishR = fr.trim().equals("") ? "" : fr;
                                break;
                        }
                    }
                    nodes.add(new Nodes(nodeID, lat, lon, name, wayType, levID, startR, finishR));
                }
            }
        }
        catch (FileNotFoundException ex) {
            System.err.println(ex.getMessage());
        }
        catch (IOException ex) {
            System.err.println(ex.getMessage());
        }
        return nodes;
    }

    // The toString() method
    @Override
    public String toString() {
        return new StringBuffer("").append("Node ID = ").append(node_ID).append(", Latitude = ")
                .append(latitude).append(", Longitude = ").append(longitude).append(", Name = ")
                .append(name).append(", Waypoint Type = ").append(waypoint_Type).append(", Level ID = ")
                .append(level_ID).append(", On Starting Route = ").append(on_Starting_Route)
                .append(", On Finish Route = ").append(on_Finish_Route).toString();
    }

}

使用节点类:

你可以这样使用这个类:

Nodes n = new Nodes();
List<Nodes> nodes = n.getNodesFromFile("Graphml.xml");

// Display the Nodes in Console Window...
if (!nodes.isEmpty()) {
    for (Nodes node : nodes) {
        // System.out.println(node.toString());
        System.out.printf("%-20s %-15s%n", "Node ID:", node.getNode_ID());
        System.out.printf("%-20s %-15s%n", "Latitude:", node.getLatitude());
        System.out.printf("%-20s %-15s%n", "Longitude:", node.getLongitude());
        System.out.printf("%-20s %-15s%n", "Name:", node.getName());
        System.out.printf("%-20s %-15s%n", "Waypoint Type:", node.getWaypoint_Type());
        System.out.printf("%-20s %-15s%n", "Level ID:", node.getLevel_ID());
        System.out.printf("%-20s %-15s%n", "On Starting Route:", node.getOn_Starting_Route());
        System.out.printf("%-20s %-15s%n", "On Finish Route:", node.getOn_Finish_Route());
        System.out.println();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多