gpt4 book ai didi

java - 高效的 SAX 处理

转载 作者:行者123 更新时间:2023-11-30 04:14:58 27 4
gpt4 key购买 nike

我有一系列包含邮政编码及其相应纬度和经度的 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,以检索每个邮政编码的经度纬度 值。因此,如果我有 2000 个实体对象,我会让 SAX 处理程序运行 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秒以下。到目前为止,我已经成功地将加载时间减少了一半以下;

  • 将处理程序运行的次数减少到必要的次数(通过减少需要检查的实体数量)。
  • 一旦找到我需要的数据,就让 startElement() 方法抛出异常,这样它就不会继续进行不必要的搜索。
  • 将 XML 文件分成更小的文件(每个字母对应一个文件),以便处理程序在每个文件中检查的元素更少。

问:对于更高效的 SAX 处理,还有其他建议吗?

最佳答案

如果您可以将想要检索地理位置的所有邮政编码传递给处理程序,则处理程序可以一次性检索它们。执行此操作的 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

中找到

关于java - 高效的 SAX 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18612101/

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