Преобразование большого файла XML в объект Java?

У меня есть xml-файл большого размера, который может варьироваться от 500 МБ до 2 ГБ, для которого я хочу выполнять проверки, такие как общее количество пользовательских тегов и другие проверки. Мой вопрос, есть ли хороший способ маршалировать полный xml-файл в java-объект без исключения OutOfMemory? Я не думаю, что это возможно, так как у меня ОЗУ 2 ГБ и размер ОЗУ 1536 МБ. Но тогда какая альтернатива?

Должен ли я разделить xml на более мелкие файлы xml с помощью STAX/SAX, а затем иметь отдельные объекты? Затем подсчитайте элементы клиента в каждом объекте Java. Сохраните его как переменную экземпляра, а затем повторите для дальнейшего xml. Совокупность всех клиентов. Если да, как я узнаю, что разложенные XML-файлы являются частью одного XML-файла. Возможно, мне нужно ввести некоторый идентификатор корреляции в имя файла, чтобы я мог знать, что отдельные узлы xml являются частью одного узла XML?


person user3198603    schedule 23.04.2014    source источник
comment
можно ли будет настроить базу данных в памяти? Если да, вы можете прочитать xml через stax/sax и сохранить данные в таблицах БД. Затем вы можете выполнять проверки с помощью запросов sql. И ваш H2 будет работать в отдельном jvm, поэтому с памятью проблем быть не должно.   -  person Hirak    schedule 23.04.2014


Ответы (2)


Что ж, для анализа xml указанных вами размеров [до 2 ГБ] вам не нужно загружать все это в ОЗУ. Вы можете использовать парсер SAX для его разбора. Здесь я нашел интересный способ сделать это

XMLReader r = new XMLReader();

   r.addHandler("node", new NodeHandler() {

     @Override
     public void process(StructuredNode node) {
       System.out.println(node.queryString("name"));
       System.out.println(node.queryValue("price").asDouble(0d));
     }
   });

   r.parse(new FileInputStream("src/examples/test.xml"));

В основном это смесь SAX и DOM. Он создает do для элемента, где у вас есть данные для обработки. Код для этого находится под лицензией MIT и может быть найден здесь

Если вышеизложенное для вас невыполнимо, я бы посоветовал вам использовать простой анализатор StAX Здесь — хороший учебник для начала

person Jabir    schedule 23.04.2014

Здесь вам поможет SAX (Simple API for XML).

В отличие от синтаксического анализатора DOM, синтаксический анализатор SAX не создает в памяти представление XML-документа, поэтому работает быстрее и использует меньше памяти. Вместо этого синтаксический анализатор SAX информирует клиентов о структуре XML-документа, вызывая обратные вызовы, то есть вызывая методы org.xml.sax.helpers.DefaultHandler экземпляра, предоставленного синтаксическому анализатору.

Вот пример реализации:

SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);

Где в MyHandler вы определяете действия, которые необходимо предпринять, когда генерируются такие события, как начало/конец документа/элемента.

class MyHandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void endDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    }

    // To take specific actions for each chunk of character data (such as
    // adding the data to a node or buffer, or printing it to a file).
    @Override
    public void characters(char ch[], int start, int length)
            throws SAXException {
    }

}
person ashokramcse    schedule 23.04.2014