gpt4 book ai didi

java - 成功将元素解析到列表后,SAX 解析器 endDocument 中的空列表

转载 作者:行者123 更新时间:2023-11-29 21:00:25 24 4
gpt4 key购买 nike

我正在尝试使用 SAX 解析器解析包含地理节点和节点连接方式的 XML。我将解析后的节点存储在 ArrayMap<Long, MapPos> 中以及 ArrayList<ArrayList<MapPos>> 中的方法.在解析一种方式时,我创建了一个 ArrayList<MapPos>引用的节点并将其添加到 ArrayList的方式。

调试应用程序后,我看到 startElement()endElement()成功将方式添加到 ArrayList , 但在 endDocument() 方法 ArrayList只包含一堆空的 ArrayList .

这是java类:

public class ParkingDataExtractor {
private static List<ArrayList<MapPos>> roads = new ArrayList<ArrayList<MapPos>>();

public static List<ArrayList<MapPos>> getWaysFromXML()
throws ParserConfigurationException, SAXException, IOException{

SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new DefaultHandler() {
ArrayMap<Long, MapPos> nodes = new ArrayMap<Long, MapPos>();
ArrayList<MapPos> nodeBuffer = new ArrayList<MapPos>();
List<ArrayList<MapPos>> ways = new ArrayList<ArrayList<MapPos>>();
// private int i; // for debug purposes

@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
if (qName.equalsIgnoreCase("node")) {
Long id = Long.parseLong(attributes.getValue("id"));
Float lat = Float
.parseFloat(attributes.getValue("lat"));
Float lon = Float
.parseFloat(attributes.getValue("lon"));
nodes.put(id, new MapPos(lat, lon));
} else if (qName.equalsIgnoreCase("nd")) {
Long ref = Long.parseLong(attributes.getValue("ref"));
nodeBuffer.add(nodes.get(ref));
}
}

@Override
public void endElement(String uri, String localName,
String qName) throws SAXException {
if (qName.equalsIgnoreCase("way")) {
ways.add(nodeBuffer);
// i++;
// if(i==1590) // last element
// ArrayList<MapPos> test = ways.get(i-1); // test = [MapPos [x=..., y=..., z=0.0], MapPos [x=..., y=..., z=0.0],...]
nodeBuffer.clear();
}
}

@Override
public void endDocument() throws SAXException {
// ArrayList<MapPos> test = ways.get(i-1); // test = []
roads = ways;
}
};

saxParser.parse("file://" + Environment.getExternalStorageDirectory()
+ "/roadmap.xml", handler);
return roads;
}
}

最佳答案

当您调用 nodeBuffer.clear() 时,您清空了刚刚传递给 ways 的列表。您基本上一遍又一遍地使用相同的 nodeBuffer 对象,并用大量对同一对象的引用填充 ways 列表 - 每次都将其清空。

您应该这样做的方法是使用new 创建一个新的ArrayList 对象,每次都将其分配给nodeBuffer。然后,您将拥有单独的对象,每个对象都包含在最新一轮中解析的节点列表。

关于java - 成功将元素解析到列表后,SAX 解析器 endDocument 中的空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26294985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com