Android Простой XML Десериализация - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь создать объекты node & edge из этого графа. У меня был отличный совет, который сказал мне использовать несколько пакетов для дальнейшего исследования, так как это была реализация android, которую я выбрал для простого xml.

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

Мне нужно вывести данные узла и края.

1 Ответ

0 голосов
/ 30 марта 2020

Библиотека Java Simple XML выглядит так, как будто она предназначена главным образом для сериализации Java объектов в XML. Он поддерживает десериализацию (разбор XML до Java), но в документации говорится:

org.simpleframework. xml .stream - Предоставляет XML разбирать слой над набором сторонних библиотек. Потоковый пакет предоставляет основанный на событиях механизм синтаксического анализа XML, который можно использовать с несколькими сторонними библиотеками, такими как DOM, StAX и XML pull API.

Другими словами, он делегирует другим пакетам.

Итак, вот подход StAX. При этом используется StAX XML Stream Reader на основе курсора (не альтернативное устройство чтения событий 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, который дает вам простой доступ к тексту каждого тега. содержимое, а также его атрибуты.

Согласно Simple XML spe c, должно быть возможно использовать это из Simple XML - но я этого не пробовал. Или, возможно, вы можете просто использовать StAX без Simple XML.

В моем случае это выводит следующий вывод:

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>
...