我的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。作为一方,我使用“来自我的项目中的这些文件”,因为我也找不到如何从同一项目中而不是从绝对目录中引用文件。
答案 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教程还包含SAX和StAX部分。
答案 2 :(得分:0)
假设您可以使用SAX或DOM相对快速地读取XML,我会提前解析它,并使用这些属性来构建邮政编码与长/长的映射,例如。
Map<String, Pair<BigDecimal,BigDecimal>>
并使用Map.get(String)
我注意到你说:
其中一些文件最多有50k行,因此将它们存储在内存中 如果可能的话,不是否
我根本不担心。一张50k条目的地图不会是一笔大买卖。
答案 3 :(得分:0)