Java SAX Поиск данных в XML-файле

Я имею .xml файлы внутри пакета в моем проекте Java, который содержит данные в следующем формате...

<?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)

Дополнительные детали; Извиняюсь за то, что первоначально упустил важные детали Некоторые из этих файлов имеют до 50 тыс. Строк, поэтому их хранение в памяти - нет, если вообще возможно. Поэтому я использую SAX. Кроме того, я использую слова "из этих файлов в моем проекте", потому что я также не могу найти ссылку на файл из того же проекта, а не из абсолютного каталога.

4 ответа

Решение

(Из комментариев по запросу ОП.)

Во-первых, вы не можете сравнить строки с == оператор. использование equals() вместо. Смотрите вопрос Как мне сравнить строки в Java? для дополнительной информации.

Во-вторых, не каждый элемент имеет атрибут postcode, поэтому возможно, что вы будете вызывать equals() на null объект, ведущий к NullPointerException, Сделайте это наоборот, например

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

Вы бы использовали парсер 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();

а затем использовать API обхода DOM.

Изменить: из исходного вопроса не было ясно, что данные, которые вы хотите обработать, большие. В этом случае DOM-парсер действительно не является хорошим решением, именно из-за потребления памяти. Для анализа больших XML-документов были изобретены парсеры SAX и StAX. Вы можете найти их немного более громоздкими в использовании из-за их потоковой природы, но это также источник их эффективности. В связанном руководстве по JAXP для Oracle есть разделы, посвященные SAX и StAX.

Предполагая, что вы можете читать XML относительно быстро, используя SAX или DOM, я бы проанализировал его заранее и использовал атрибуты для построения карты почтового индекса vs long/lang, например

Map<String, Pair<BigDecimal,BigDecimal>>

и просто поиск с помощью Map.get(String)

Я отмечаю, что вы говорите:

Некоторые из этих файлов имеют до 50 тыс. Строк, поэтому их хранение в памяти - нет, нет, если вообще возможно

Я бы не волновался об этом вообще. Карта из 50 000 записей не будет серьезной сделкой.

Вы можете использовать javax.xml.xpath API включены в JDK/JRE и используют XPath для указания данных, которые вы хотите получить из XML-документа.

пример

Другие вопросы по тегам