Итак, мне нужно написать парсер, который может анализировать OSM-файлы, и мне было интересно, как оптимизировать его с точки зрения производительности и читаемости. У меня есть две версии одного и того же парсера. Один самодельный, а другой использует собственный XML-парсер Java. Может ли кто-нибудь мне помочь?
Заранее спасибо.
примечание: stackoverflow не позволил бы Меду опубликовать этот пост, пока я не добавил больше текста. Вот такая шутка.
Священник, иман и раввин заходят в бар, и бармен спрашивает: «Это шутка или что?»
//HOMEMADE PARSER
public class Parser implements IParser {
private final String fileName;
private final List boundingBox = new ArrayList();
private final HashMap osmNodeMap = new HashMap();
private final HashMap osmWayMap = new HashMap();
private final HashMap osmRelationMap = new HashMap();
public Parser(String filename) {
this.fileName = filename;
}
@Override
public void parse() {
try {
InputStream is = Parser.class.getResourceAsStream("/data/" + fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
String line;
while ((line = br.readLine()) != null) {
//System.out.println(line);
line=line.trim();
if (line.startsWith(" {
long id = getAttrLong(r, "id");
double lat = getAttrDouble(r, "lat");
double lon = getAttrDouble(r, "lon");
osmNodeMap.put(id, new OsmNode(id, lat, lon));
}
case "way" -> {
currentWayId = getAttrLong(r, "id");
currentWayNodes = new ArrayList();
currentWayTags = new HashMap();
}
case "nd" -> {
if (currentWayId != null) {
long ref = getAttrLong(r, "ref");
OsmNode n = osmNodeMap.get(ref);
if (n != null) currentWayNodes.add(n);
}
}
case "relation" -> {
currentRelId = getAttrLong(r, "id");
OsmRelation currentRelation = osmRelationMap.get(currentRelId);
if (currentRelation == null) {
currentRelation = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, currentRelation);
}
currentRelMembers = new ArrayList();
currentRelTags = new HashMap();
}
case "member" -> {
if (currentRelId != null) {
String type = getAttr(r, "type");
long refId = getAttrLong(r, "ref");
String role = getAttr(r, "role");
switch (type) {
case "node" -> {
OsmNode node = osmNodeMap.get(refId);
if (node != null) currentRelMembers.add(new Member(node, role));
}
case "way" -> {
OsmWay way = osmWayMap.get(refId);
if (way != null) currentRelMembers.add(new Member(way, role));
}
case "relation" -> {
OsmRelation refRel = osmRelationMap.get(refId);
if (refRel == null) {
refRel = new OsmRelation(refId, new ArrayList(), new HashMap());
osmRelationMap.put(refId, refRel);
}
currentRelMembers.add(new Member(refRel, role));
}
default -> {
}
}
}
}
case "tag" -> {
String k = getAttr(r, "k");
String v = getAttr(r, "v");
if (currentWayId != null) {
currentWayTags.put(k, v);
} else if (currentRelId != null) {
currentRelTags.put(k, v);
} else {
}
}
default -> {
}
}
}
if (event == XMLStreamConstants.END_ELEMENT) {
String name = r.getLocalName();
switch (name) {
case "way" -> {
if (currentWayId != null) {
OsmWay way = new OsmWay(currentWayId, currentWayNodes, currentWayTags);
osmWayMap.put(currentWayId, way);
currentWayId = null;
currentWayNodes = null;
currentWayTags = null;
}
}
case "relation" -> {
if (currentRelId != null) {
OsmRelation rel = osmRelationMap.get(currentRelId);
if (rel == null) {
rel = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, rel);
}
rel.setMembers(currentRelMembers);
rel.setTags(currentRelTags);
currentRelId = null;
currentRelMembers = null;
currentRelTags = null;
}
}
default -> {
}
}
}
}
r.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static void safeConfigure(XMLInputFactory factory) {
try {
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
} catch (IllegalArgumentException ignored) {}
try {
factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
} catch (IllegalArgumentException ignored) {}
}
private static String getAttr(XMLStreamReader r, String name) {
return r.getAttributeValue(null, name);
}
private static long getAttrLong(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? 0L : Long.parseLong(v);
}
private static double getAttrDouble(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? Double.NaN : Double.parseDouble(v);
}
@Override
public List getBoundingBox() {
return boundingBox;
}
@Override
public HashMap getOsmNodeMap() {
return osmNodeMap;
}
@Override
public HashMap getOsmWayMap() {
return osmWayMap;
}
@Override
public HashMap getOsmRelationMap() {
return osmRelationMap;
}
}
Подробнее здесь: https://stackoverflow.com/questions/799 ... ile-parser
Мобильная версия