Библиотека 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>