На работе я анализирую большие XML-файлы, используя класс DefaultHandler
. Делая это, я заметил, что этот интерфейс выделяет много String
s для имен элементов, имен и значений атрибутов и т. Д.
Исходя из этого, я подумал о создании парсера XML, который бы выполнял только абсолютный минимум размещения объектов. На данный момент мне нужно:
- один StringBuilder для построения имен элементов, имен атрибутов и т. Д.
- один CharsetDecoder для преобразования байтов в символы.
Моя тестовая программа для разбора http://magnatune.com/info/song_info.xml, выглядит так:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class XmlParserDemo {
public static void main(String[] args) throws IOException {
List<Map<String, String>> allSongs = new ArrayList<Map<String, String>>();
InputStream fis = new FileInputStream("d:/song_info.xml");
try {
XmlParser parser = new XmlParser(new BufferedInputStream(fis));
if (parser.element("AllSongs")) {
while (parser.element("Track")) {
Map<String, String> track = new LinkedHashMap<String, String>();
while (parser.element()) {
String name = parser.getElementName();
String value = parser.text();
track.put(name, value);
parser.endElement();
}
allSongs.add(track);
parser.endElement();
}
parser.endElement();
}
} finally {
fis.close();
}
}
}
Этот код выглядит лучше, чем мои эксперименты с XMLEventReader
. Теперь единственной недостающей частью будет класс XmlParser
, упомянутый в коде выше. Знаете ли вы, если кто-то написал этот код раньше? Это действительно мой любимый проект, но мне любопытно, сколько стоит старое утверждение Создание объекта стоит больше стоит.
Да, я знаю, что LinkedHashMap
s используют много памяти. Это действительно просто часть синтаксического анализа, которую я хочу эффективно использовать в памяти. Все остальное просто для простого примера.