我有一系列包含相应纬度和经度的邮政编码的XML,就像这样;
<?xml version="1.0"?>
<postcodes>
<entry postcode='AB1 0AA' latitude='7.101478' longitude='2.242852' />
<entry postcode='AB1 0AB' latitude='7.201458' longitude='2.122952' />
</postcodes>
XML被分成以特定字母开头的邮政编码,因此字母表中的每个字母都有一个XML。在他们之间,他们拥有英国的每个邮政编码,这意味着这些XML文件中最大的有300,000个entry
元素。
我正在遍历实体对象列表以通过SAX放置其邮政编码,以针对每个邮政编码检索longitude
和latitude
值。所以,如果我有2000个实体对象,我会让SAX Handler运行2000次以检索这些值。下面循环的代码;
em = emf.createEntityManager();
for (Integer id : siteID){
site = em.find(SiteTable.class, id);
if(site != null && site.getPostcode() != null && !site.getPostcode().equals("")){
XMLPositionRetriever.runXMLQuery(site.getPostcode());
}
else{
System.out.println("The site and/or postcode against this Instruction does not exist.");
}
}
em.close();
处理程序中的 site.getPostcode()
变为postcodeToFind
。下面使用的唯一SAX处理程序方法的代码;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (postcodeToFind.equals(attributes.getValue("postcode"))){
System.out.println("The postcode '"+postcodeToFind+"', has a latitude of "+attributes.getValue("latitude")+" and a longitude of "+attributes.getValue("longitude"));
throw new SAXException();
}
}
目前这是耗时的(2000次搜索需要不到4分钟),但我需要加载时间快。最好在30秒以下。到目前为止,我已经设法将负载时间减少到远低于一半;
问:有没有人提出更有效的SAX处理方法?
答案 0 :(得分:2)
如果您可以将要为其检索地理位置的所有邮政编码传递给处理程序,则处理程序可以一次性检索它们。 执行此操作的SAXHandler在此处可能如下所示:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXDemo extends DefaultHandler {
private Map<String, Location> postalCodeMap;
static class Location {
String latitude;
String longitude;
}
public SAXDemo(List<String> postalCodes) {
this.postalCodeMap = new HashMap<String, SAXDemo.Location>();
for (String postalCodeToLookFor : postalCodes) {
this.postalCodeMap.put(postalCodeToLookFor, new Location());
}
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
String postCodeOfElem = attributes.getValue("postcode");
if (postCodeOfElem != null && this.postalCodeMap.containsKey(postCodeOfElem)) {
Location loc = this.postalCodeMap.get(postCodeOfElem);
loc.latitude = attributes.getValue("latitude");
loc.longitude = attributes.getValue("longitude");
}
}
public Location getLocationForPostalCode(String postalCode) {
return this.postalCodeMap.get(postalCode);
}
public Map<String, Location> getAllFoundGeoLocations() {
return this.postalCodeMap;
}
}
在这里,您将一个字符串列表传递给处理程序的构造函数,然后让处理程序使用您的所有XML数据解析文档。
解析完成后,可以在postalCodeMap