Android Simplexml Deserialisation
Solution 1:
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 - 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.
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:
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;
...
privatefinalStringfileNameString="C:/tmp/files/graphml.xml";
publicvoidread()throws XMLStreamException, FileNotFoundException {
XMLInputFactoryxmlif= XMLInputFactory.newInstance();
XMLStreamReaderxmlr= xmlif.createXMLStreamReader(fileNameString,
newFileInputStream(fileNameString));
while (xmlr.hasNext()) {
inteventType= xmlr.next();
if (eventType == XMLEvent.START_ELEMENT) {
if (xmlr.getLocalName().equals("node")) {
if (xmlr.getAttributeCount() == 1) { // a safety checkStringnodeID= xmlr.getAttributeValue(0);
System.out.println("---");
System.out.println("Node ID: " + nodeID);
}
}
if (xmlr.getLocalName().equals("data")) {
if (xmlr.getAttributeCount() == 1) { // a safety checkStringdataKey= xmlr.getAttributeValue(0);
StringdataValue= xmlr.getElementText();
System.out.println("Data key: " + dataKey + " Data value: " + dataValue);
}
}
}
}
}
The key part is the XMLStreamReader
object which gives you simple access to each tag's text contents, and to its attributes as well.
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-022Data key: lat Data value:40.69330963Data key: lon Data value:-73.98752537Data key: name Data value:Data key: waypoint_type Data value:escalatorData key: level_id Data value:1080000Data key: on_starting_route Data value:Data key: on_finish_route Data value:---Node ID:L08-023Data key: lat Data value:40.69318355Data key: lon Data value:-73.98755793Data key: name Data value:Data key: waypoint_type Data value:stairsData key: level_id Data value:1080000Data key: on_starting_route Data value:Data key: on_finish_route Data value:---Node ID:L08-024Data key: lat Data value:40.69316844Data key: lon Data value:-73.98755873Data key: name Data value:Data key: waypoint_type Data value:stairsData key: level_id Data value:1080000Data 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'?><graphmlxmlns="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"><keyattr.name="weight"attr.type="double"for="edge"id="weight" /><keyattr.name="edgeid"attr.type="string"for="edge"id="edgeid" /><keyattr.name="alpha"attr.type="string"for="edge"id="alpha" /><keyattr.name="intendedpathlonlat"attr.type="string"for="edge"id="intendedpathlonlat" /><keyattr.name="levelid"attr.type="string"for="edge"id="levelid" /><keyattr.name="weight"attr.type="long"for="edge"id="weight" /><keyattr.name="type"attr.type="string"for="edge"id="type" /><keyattr.name="relatedroutes"attr.type="string"for="node"id="relatedroutes" /><keyattr.name="description"attr.type="string"for="node"id="description" /><keyattr.name="title"attr.type="string"for="node"id="title" /><keyattr.name="on_finish_route"attr.type="string"for="node"id="on_finish_route" /><keyattr.name="on_starting_route"attr.type="string"for="node"id="on_starting_route" /><keyattr.name="level_id"attr.type="string"for="node"id="level_id" /><keyattr.name="waypoint_type"attr.type="string"for="node"id="waypoint_type" /><keyattr.name="name"attr.type="string"for="node"id="name" /><keyattr.name="lon"attr.type="string"for="node"id="lon" /><keyattr.name="lat"attr.type="string"for="node"id="lat" /><graphedgedefault="directed"id="new id here"><nodeid="L08-022"><datakey="lat">40.69330963</data><datakey="lon">-73.98752537</data><datakey="name" /><datakey="waypoint_type">escalator</data><datakey="level_id">1080000</data><datakey="on_starting_route" /><datakey="on_finish_route" /></node><nodeid="L08-023"><datakey="lat">40.69318355</data><datakey="lon">-73.98755793</data><datakey="name" /><datakey="waypoint_type">stairs</data><datakey="level_id">1080000</data><datakey="on_starting_route" /><datakey="on_finish_route" /></node><nodeid="L08-024"><datakey="lat">40.69316844</data><datakey="lon">-73.98755873</data><datakey="name" /><datakey="waypoint_type">stairs</data><datakey="level_id">1080000</data><datakey="on_starting_route" /><datakey="on_finish_route" /></node></graph></graphml>
Post a Comment for "Android Simplexml Deserialisation"