我正在尝试从此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)-但是documentation说:
org.simpleframework.xml.stream-在一组第三方库上提供XML解析层。流包提供了一个基于事件的XML解析框架,该框架可与多个第三方库(例如DOM,StAX和XML pull API)一起使用。
换句话说,它委托给其他包。
因此,这是一种StAX方法。它使用基于游标的StAX XML流阅读器(而不是替代的StAX事件阅读器),因为正如“比较游标和迭代器API”部分中的here所示:
如果您正在针对特别受内存限制的环境(例如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使用它-但我没有尝试过。或者,也许您可以只使用完全没有SimpleXML的StAX。
就我而言,这将输出以下输出:
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>