Более общий способ анализа XML из Java в потоковом режиме? - PullRequest
0 голосов
/ 21 января 2011

Мне нужно эффективно проанализировать потенциально очень большие файлы XML (и, следовательно, не могу поместить весь файл в память). В связи с этим я рассмотрел методы потоковой передачи, такие как XMLStreamReader, однако они выглядят очень низкоуровневыми и дают очень жестко закодированный код:

   event = parser.next();
   switch (event)
   {
    case XMLStreamConstants.START_ELEMENT:
         elementName = parser.getLocalName();
         if (elementName.equals("name")){
             state = FOUND_A_NAME;
         }else if (elementName.equals("address")){
             state = FOUND_AN_ADDRESS;                      
         }
    ETC...
    }

Я ищу способ сделать это без такой тесной связи синтаксического анализатора с анализируемой вещью, и, кроме того, этот код просто не выглядит правильным. Похоже, это должно быть более по-настоящему ориентировано на события.

Любой совет?

Ответы [ 4 ]

2 голосов
/ 21 января 2011

Если вы ищете язык более высокого уровня для обработки XML в потоковом режиме, и если вы не против того, чтобы быть на переднем крае, рассмотрите возможности потоковой передачи в Saxon-EE 9.3 XSLT - частичной реализации проект спецификации XSLT 3.0.

http://www.saxonica.com/documentation/sourcedocs/streaming.xml

2 голосов
/ 21 января 2011

SAX имеет события, которые делают именно то, что, как вы думаете, должны .. :) http://www.saxproject.org/quickstart.html показывает простую кодовую базу, которая делает это.Я что-то упустил?

1 голос
/ 04 января 2012

Это может быть написано родовым.Например, у меня есть файл свойств, который имеет соответствие между именем элемента xml и именем поля класса / именем ключа hashmap.

if (event.isStartElement()) {
 if  (event.asStartElement().getName().getLocalPart().equals(XMLElementName)) {

    event = eventReader.nextEvent();
    fields.put(classFieldName, event.asCharacters().getData());
        continue;
 }
}

это помогает нам иметь один парсер для разбора разных xml-сообщений.Это просто идея .. мы можем сделать больше ..

0 голосов
/ 21 января 2011

Я не думаю, что тесно связанная природа вашего кода имеет какое-либо отношение к StAX, это просто способ, которым вы решили написать его.

Вы можете легко реорганизовать этот код для делегирования обработкисобытий для обработки объектов, используя таблицу поиска, например, имен элементов для обработки объектов.Этот механизм может быть полностью универсальным и многоразовым.

...