2016-12-15 1 views
1

Сжатие может радикально уменьшить большой размер XML файла, который имеет влияние на:Как хранить большие заархивированные XML-файлы и эффективно извлекать только отдельные данные (Alfresco)?

  • использования пространства хранения, IO Уэйтса (чтения и записи)
  • использование сети

Я должен извлечь только некоторые конкретные данные из zipped XML. Это Носорог JavaScript (в основном Java) Пример:

var zis = new java.util.zip.ZipInputStream(document.properties.content.getInputStream()); 
var ze = zis.getNextEntry(); 
if (ze!=null){ 
    var scanner = new java.util.Scanner(zis,"UTF-8").useDelimiter("\\A"); 
    var content = scanner.hasNext() ? scanner.next() : ""; 
    var docXml = new XML(content); 
    logger.log("xml mytag/text(): "+docXml.mytag); 
} 
zis.closeEntry(); 
zis.close(); 

Но, нет необходимости загружать весь XML в DOM, если я должен извлечь только некоторые специфические элементы (из заголовка XML, например). Алгоритм должен перестать читать XML-файл, когда все запрошенные элементы будут найдены (или нет возможности их найти).

Есть ли предоставленная служба Alfresco или java-библиотека, которая делает это и извлекает запрошенные элементы из XML с использованием, например, StAX2 API (Woodstox)?

+0

Не кажется легким. Можете ли вы рассказать нам, как бы вы определили, что нужно для восстановления? Это может быть, например, первый тег non root, тэг 300th , все текстовое содержимое ... Возможно, есть способы сделать это как можно быстрее, если мы это узнаем. – GPI

+0

@GPI - например, карта (hashmap) путей – wildloop

+0

Вы можете использовать Stax2/Woodstox для извлечения необходимых XML-частей, а затем запускать XPaths. Это нелегко сделать (множество дьяволов в деталях). Я нашел старый [блог] (http://andreas.haufler.info/2012/01/conveniently-processing-large-xml-files.html), объясняющий технику, и связанный с ней исходный код перемещался, но, похоже, поддерживается [здесь] (https://github.com/scireum/sirius-kernel/tree/master/src/main/java/sirius/kernel/xml). Я не использовал его, но он может быть достаточно для того, что вам нужно. – vanOekel

ответ

0

Я думаю, что вы можете очень хорошо использовать Stax для этого:

XMLInputFactory factory = XMLInputFactory.newInstance(); 
XMLEventReader r = factory.createXMLEventReader 
        (ze.getName(),zis); 

, а затем прочитать XMLEvent по XMLEvent с помощью XMLEventReader. Если вы нашли соответствующий тег и значение в XML, который вы ищете, вы можете вызвать r.close(), который закроет парсер Stax (но не почтовый входной поток) и продолжит следующую запись в zip.

+0

Спасибо, я знаю, как использовать StAX: http://stackoverflow.com/questions/41108090/how-to-get-xml-element- путь-используя-StAX-stax2 – wildloop

Смежные вопросы