Java SAX在XML文件中搜索数据

时间:2013-08-30 14:35:22

标签: java xml persistence sax jaxp

我的Java项目中的包中有.xml个文件,其中包含以下格式的数据...

<?xml version="1.0"?>
<postcodes>
    <entry postcode='AB1 0AA' latitude='7.101478' longitude='2.242852' />
</postcodes>

我目前已将我的自定义startElement()中的DefaultHandler覆盖为以下内容;

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if (attributes.getValue("postcode") == "AB43 8TZ"){
        System.out.println("The postcode 'AB43 8TZ', has a latitude of "+attributes.getValue("latitude")+" and a longitude of "+attributes.getValue("longitude"));
    }
}

我知道代码在此方法之外工作,因为我之前通过打印出每个元素的所有属性来测试它,并且工作正常。然而,现在它什么也没做,好像它从未发现过邮政编码的价值。 (我知道它就在那里,因为它是来自XML源的复制粘贴作业)

额外细节;最初遗漏重要细节的道歉。其中一些文件有多达50k行,所以如果可能的话,将它们存储在内存中是不可能的。因此,我正在使用SAX。作为一方,我使用“来自我的项目中的这些文件”,因为我也找不到如何从同一项目中而不是从绝对目录中引用文件。

4 个答案:

答案 0 :(得分:2)

(根据OP的要求发表评论。)

首先,您无法将字符串与==运算符进行比较。请改用equals()。有关详细信息,请参阅问题How do I compare strings in Java?

其次,并非每个元素都具有postcode属性,因此您可能会在equals()对象上调用null,从而导致NullPointerException。反过来说,例如。

"AB43 8TZ".equals(attributes.getValue("postcode"))

答案 1 :(得分:1)

您将使用XML解析器。幸运的是,JDK以JAXP的形式提供了这些开箱即用的功能。现在,有几种方法可以做到这一点,因为解析XML的主要“风味”很少。对于此任务,我相信DOM解析器最容易使用。你可以这样做:

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(new File("name/of/the/file.xml"));
Element root = document.getDocumentElement();

然后使用DOM遍历API。

编辑:从原始问题中不清楚您要处理的数据很大。在这种情况下,DOM解析器确实不是一个好的解决方案,正是由于内存消耗。为了解析大型XML文档,发明了SAX和StAX解析器。由于它们的流媒体特性,您可能会发现它们使用起来有点麻烦,但这也是它们效率的来源。链接的Oracle JAXP教程还包含SAXStAX部分。

答案 2 :(得分:0)

假设您可以使用SAX或DOM相对快速地读取XML,我会提前解析它,并使用这些属性来构建邮政编码与长/长的映射,例如。

Map<String, Pair<BigDecimal,BigDecimal>>

并使用Map.get(String)

进行查找

我注意到你说:

  

其中一些文件最多有50k行,因此将它们存储在内存中   如果可能的话,不是否

我根本不担心。一张50k条目的地图不会是一笔大买卖。

答案 3 :(得分:0)

您可以使用JDK / JRE中包含的javax.xml.xpath API,并使用XPath指定要从XML文档中检索的数据。

示例