Android SimpleXML 反序列化 [英] Android SimpleXML Deserialisation

查看:25
本文介绍了Android SimpleXML 反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建节点 &来自这个 graphml 的边缘对象.我有一些很好的建议,告诉我在进一步研究中使用几个包,它是我选择 simplexml 的 android 实现.

I am trying to create node & edge objects from this graphml. I had some great advice that told me to use several packages, on further research, with it being an android implementation I went for simplexml.

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

我从节点开始.我已经创建了我的节点类:

I am starting with the nodes. I have created my node class:

@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 中,我添加了:

In my mainActivity i added:

 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开头的一个例子:

An example of the start of the 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

我需要获取节点和边缘数据.

I need to get the node and edge data out.

推荐答案

Java SimpleXML 库看起来主要用于将 Java 对象序列化为 XML.它确实支持反序列化(将 XML 解析为 Java) - 但 documentation 说:

The Java SimpleXML library looks like it is primarily for serializing Java objects to XML. It does support deserialization (parsing XML to Java) - but the documentation says:

org.simpleframework.xml.stream - 在一组第三方库上提供 XML 解析层.流包提供了一个基于事件的 XML 解析框架,可以与多个第三方库一起使用,例如 DOM、StAX 和 XML pull API.

org.simpleframework.xml.stream - Provides an XML parsing layer over a set of third party libraries. The stream package provides an event based XML parsing framework that can be used with several third party libraries such as DOM, StAX and the XML pull API.

换句话说,它委托给其他包.

In other words, it delegates to other packages.

所以,这是一种 StAX 方法.这使用基于游标的 StAX XML Stream Reader(不是替代 StAX 事件阅读器),因为正如它所说的 此处在比较游标和迭代器 API"部分:

So, here is a StAX approach. This uses the cursor-based StAX XML Stream Reader (not the alternative StAX event reader), because as it says here in the "Comparing Cursor and Iterator APIs" section:

如果您正在为内存特别受限的环境(例如 Java ME)进行编程,则可以使用游标 API 编写更小、更高效的代码.

If you are programming for a particularly memory-constrained environment, like Java ME, you can make smaller, more efficient code with the cursor API.

这是方法.它只是解析输入文件并打印出相关部分.它不会尝试做更多的事情 - 只是为了演示如何访问您需要的数据项:

Here is the approach. It just parses the input file and prints out the relevant parts. It does not attempt to do anything more than that - just to demonstrate how to access the data items you need:

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 对象,它使您可以轻松访问每个标签的文本内容及其属性.

The key part is the XMLStreamReader object which gives you simple access to each tag's text contents, and to its attributes as well.

根据 SimpleXML 规范,应该可以从 SimpleXML 中使用它 - 但我没有尝试过.或者,您也可以只使用 StAX,而完全不使用 SimpleXML.

According to the SimpleXML spec, it should be possible to use this from SimpleXML - but I did not try that. Or perhaps you can just use StAX without SimpleXML at all.

就我而言,这会打印以下输出:

In my case this prints the following output:

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: 

我使用的示例文件是这样的:

The sample file I used was this:

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

这篇关于Android SimpleXML 反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆