1

我的 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

4 回答 4

2

(来自OP要求的评论。)

首先,您不能将字符串与==运算符进行比较。改为使用equals()。请参阅问题如何在 Java 中比较字符串?了解更多信息。

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

"AB43 8TZ".equals(attributes.getValue("postcode"))
于 2013-09-20T14:52:24.717 回答
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的部分。

于 2013-08-30T14:42:44.920 回答
0

假设您可以使用 SAX 或 DOM 相对快速地读取 XML,我会提前解析它,并使用属性来构建 postcode 与 long/lang 的映射,例如

Map<String, Pair<BigDecimal,BigDecimal>>

并简单地使用Map.get(String)

我注意到你说:

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

我根本不会担心这个。一张包含 50k 个条目的地图不会有什么大不了的。

于 2013-08-30T14:39:33.023 回答
0

您可以使用javax.xml.xpathJDK/JRE 中包含的 API 并使用 XPath 来指定您希望从 XML 文档中检索的数据。

例子

于 2013-08-30T16:23:52.680 回答