2013-08-30 38 views
1

一個XML文件,我有一個包含下列格式的數據我的Java項目中的包內.xml文件...Java的SAX搜索數據

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

我現在已經在我的自定義DefaultHandler overrided的startElement()到下列;

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

使用XML解析器。 –

+0

那麼,我已經研究了DOM和JAXP。但是,兩者似乎都希望將XML的詳細信息存儲在內存中,在我的情況下這是一個可怕的想法,因爲其中一些XML的長度爲4萬行或更多。 –

+0

編輯問題以更好地適應SO上首選的問題風格。請重新打開。 –

回答

2

(脫離由OP要求評論。)

首先,你不能比較與==操作字符串。改爲使用equals()。有關更多信息,請參閱問題How do I compare strings in Java?。其次,不是每個元素都有郵編屬性,所以你可能會在null對象上調用equals(),導致NullPointerException。反過來,例如

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

假設您可以使用SAX或DOM相對較快地讀取XML,我會事先解析它,並使用這些屬性來構造一個postcode vs long/lang例如

Map<String, Pair<BigDecimal,BigDecimal>> 

,並簡單地查找使用Map.get(String)

我注意到,你說:

一些文件已高達50K線,所以將它們存儲在內存 一種沒有沒有,如果在所有可能的

我根本不用擔心。 50k條目的地圖不會成爲一個大問題。

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的章節。

0

您可以使用JDK/JRE中包含的javax.xml.xpath API,並使用XPath指定要從XML文檔檢索的數據。