我正在尝试从此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对象,它使您可以轻松访问每个标签的文本内容以及属性。
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>