簡體   English   中英

Android SimpleXML 反序列化

[英]Android SimpleXML Deserialisation

我正在嘗試從此 graphml 創建節點和邊緣對象。 我有一些很好的建議,告訴我在進一步研究中使用幾個包,它是我選擇 simplexml 的 android 實現。

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#nested

我從節點開始。 我已經創建了我的節點類:

@Root(name="node")
public class DeserialisedNode implements Serializable {

    public DeserialisedNode() {
        super();
    }

    @Attribute(name = "id")
    private int iD;

    private String venueId;
    @Element(name = "name")
    private String name;
    @Element(name = "waypoint_type")
    private String type;
    @Element(name = "lat")
    private double latitude;
    @Element(name = "lon")
    private double longitude;
    @Element(name = "level_id")
    private int levelId;
    @Element(name = "on_starting_route")
    private String onStartingRoute;
    @Element(name = "on_finish_route")
    private String onFinishRoute;


    public DeserialisedNode(int iD, String name, String type, double latitude, double longitude, int levelId, String onStartingRoute, String onFinishRoute) {
        this.iD = iD;
        this.name = name;
        this.type = type;
        this.latitude = latitude;
        this.longitude = longitude;
        this.levelId = levelId;
        this.onStartingRoute = onStartingRoute;
        this.onFinishRoute = onFinishRoute;
    }
}

在我的 mainActivity 中,我添加了:

 try {
            Serializer serializer = new Persister();
            AssetManager assetManager = getAssets();
            InputStream inputStream = assetManager.open("routing.xml");
            DeserialisedNode node = serializer.read(DeserialisedNode.class, inputStream);
            System.out.println("It worked! "+node.getClass().getName());
            System.out.println("It worked! "+node.getClass().getName());
        }
        catch (Exception e) {
            e.printStackTrace();
            System.out.println("error! "+e.getMessage());
        }

xml開頭的一個例子:

<?xml version='1.0' encoding='utf-8'?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <key attr.name="weight" attr.type="double" for="edge" id="weight" />
  <key attr.name="edgeid" attr.type="string" for="edge" id="edgeid" />
  <key attr.name="alpha" attr.type="string" for="edge" id="alpha" />
  <key attr.name="intendedpathlonlat" attr.type="string" for="edge" id="intendedpathlonlat" />
  <key attr.name="levelid" attr.type="string" for="edge" id="levelid" />
  <key attr.name="weight" attr.type="long" for="edge" id="weight" />
  <key attr.name="type" attr.type="string" for="edge" id="type" />
  <key attr.name="relatedroutes" attr.type="string" for="node" id="relatedroutes" />
  <key attr.name="description" attr.type="string" for="node" id="description" />
  <key attr.name="title" attr.type="string" for="node" id="title" />
  <key attr.name="on_finish_route" attr.type="string" for="node" id="on_finish_route" />
  <key attr.name="on_starting_route" attr.type="string" for="node" id="on_starting_route" />
  <key attr.name="level_id" attr.type="string" for="node" id="level_id" />
  <key attr.name="waypoint_type" attr.type="string" for="node" id="waypoint_type" />
  <key attr.name="name" attr.type="string" for="node" id="name" />
  <key attr.name="lon" attr.type="string" for="node" id="lon" />
  <key attr.name="lat" attr.type="string" for="node" id="lat" />
  <graph edgedefault="directed" id="new id here">
    <node id="L08-022">
      <data key="lat">30.69330963</data>
      <data key="lon">-53.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">30.69318355</data>
      <data key="lon">-53.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>
etc......

我的錯誤是:

W/System.err: org.simpleframework.xml.core.AttributeException: Attribute 'schemaLocation' does not have a match in class com.app.model.maps.DeserialisedNode at line 2

我需要獲取節點和邊緣數據。

Java SimpleXML 庫看起來主要用於將 Java 對象序列化為 XML。 它確實支持反序列化(將 XML 解析為 Java)——但文檔說:

org.simpleframework.xml.stream - 在一組第三方庫上提供 XML 解析層。 流包提供了一個基於事件的 XML 解析框架,可以與多個第三方庫一起使用,例如 DOM、StAX 和 XML pull API。

換句話說,它委托給其他包。

所以,這是一種 StAX 方法。 它使用基於指針的StAX XML流讀取(而不是替代的StAX事件閱讀器),因為它說,這里的“比較光標和迭代器的API”部分:

如果您正在為內存特別受限的環境(如 Java ME)進行編程,則可以使用游標 API 編寫更小、更高效的代碼。

這是方法。 它只是解析輸入文件並打印出相關部分。 它不會嘗試做更多的事情 - 只是為了演示如何訪問您需要的數據項:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;

...

private final String fileNameString = "C:/tmp/files/graphml.xml";

public void read() throws XMLStreamException, FileNotFoundException {
    XMLInputFactory xmlif = XMLInputFactory.newInstance();
    XMLStreamReader xmlr = xmlif.createXMLStreamReader(fileNameString,
            new FileInputStream(fileNameString));

    while (xmlr.hasNext()) {
        int eventType = xmlr.next();

        if (eventType == XMLEvent.START_ELEMENT) {
            if (xmlr.getLocalName().equals("node")) {
                if (xmlr.getAttributeCount() == 1) { // a safety check
                    String nodeID = xmlr.getAttributeValue(0);
                    System.out.println("---");
                    System.out.println("Node ID: " + nodeID);
                }
            }
            if (xmlr.getLocalName().equals("data")) {
                if (xmlr.getAttributeCount() == 1) { // a safety check
                    String dataKey = xmlr.getAttributeValue(0);
                    String dataValue = xmlr.getElementText();
                    System.out.println("Data key: " + dataKey + " Data value: " + dataValue);
                }
            }
        }
    }
}

關鍵部分是XMLStreamReader對象,它使您可以輕松訪問每個標簽的文本內容及其屬性。

根據 SimpleXML 規范,應該可以從 SimpleXML 使用它 - 但我沒有嘗試過。 或者,您可以只使用 StAX,而根本不使用 SimpleXML。

在我的情況下,這會打印以下輸出:

Node ID: L08-022
Data key: lat Data value: 40.69330963
Data key: lon Data value: -73.98752537
Data key: name Data value: 
Data key: waypoint_type Data value: escalator
Data key: level_id Data value: 1080000
Data key: on_starting_route Data value: 
Data key: on_finish_route Data value: 
---
Node ID: L08-023
Data key: lat Data value: 40.69318355
Data key: lon Data value: -73.98755793
Data key: name Data value: 
Data key: waypoint_type Data value: stairs
Data key: level_id Data value: 1080000
Data key: on_starting_route Data value: 
Data key: on_finish_route Data value: 
---
Node ID: L08-024
Data key: lat Data value: 40.69316844
Data key: lon Data value: -73.98755873
Data key: name Data value: 
Data key: waypoint_type Data value: stairs
Data key: level_id Data value: 1080000
Data key: on_starting_route Data value: 
Data key: on_finish_route Data value: 

我使用的示例文件是這樣的:

<?xml version='1.0' encoding='utf-8'?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key attr.name="weight" attr.type="double" for="edge" id="weight" />
  <key attr.name="edgeid" attr.type="string" for="edge" id="edgeid" />
  <key attr.name="alpha" attr.type="string" for="edge" id="alpha" />
  <key attr.name="intendedpathlonlat" attr.type="string" for="edge" id="intendedpathlonlat" />
  <key attr.name="levelid" attr.type="string" for="edge" id="levelid" />
  <key attr.name="weight" attr.type="long" for="edge" id="weight" />
  <key attr.name="type" attr.type="string" for="edge" id="type" />
  <key attr.name="relatedroutes" attr.type="string" for="node" id="relatedroutes" />
  <key attr.name="description" attr.type="string" for="node" id="description" />
  <key attr.name="title" attr.type="string" for="node" id="title" />
  <key attr.name="on_finish_route" attr.type="string" for="node" id="on_finish_route" />
  <key attr.name="on_starting_route" attr.type="string" for="node" id="on_starting_route" />
  <key attr.name="level_id" attr.type="string" for="node" id="level_id" />
  <key attr.name="waypoint_type" attr.type="string" for="node" id="waypoint_type" />
  <key attr.name="name" attr.type="string" for="node" id="name" />
  <key attr.name="lon" attr.type="string" for="node" id="lon" />
  <key attr.name="lat" attr.type="string" for="node" id="lat" />
  <graph edgedefault="directed" id="new id here">
    <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>
  </graph>
</graphml>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM