Java: разделение большого файла XML с помощью SAXParser

Я пытаюсь разбить большой файл XML на более мелкие файлы, используя java SAXParser (в частности, дамп википедии, который составляет около 28 ГБ без сжатия).

У меня есть класс Pagehandler, который расширяет DefaultHandler:

private class PageHandler extends DefaultHandler {

   private StringBuffer text;
   ...

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

        text.append("<" + qName + ">");
  }

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

        text.append("</" + qName + ">");

        if (qName.equals("page")) {
            text.append("\n");
            pageCount++;
            writePage();
        }

        if (pageCount >= maxPages) {
            rollFile();
        }
    }

  @Override
  public void characters(char[] chars, int start, int length) {
        for (int i = start; i < start + length; i++) {
            text.append(chars[i]);
        }
    }
}

Так что я могу выписать содержимое элемента без проблем. Моя проблема заключается в том, как получить теги и атрибуты элемента - эти символы, похоже, не сообщаются. В лучшем случае мне придется реконструировать их из того, что передается в качестве аргументов для startElement, что кажется немного болезненным. Или есть более простой способ?

Все, что я хочу сделать, это прокрутить файл и записать его, время от времени прокручивая выходной файл. Как же это сложно :)

Спасибо


person Richard H    schedule 03.10.2010    source источник
comment
VTD-XML идеально подходит для разбиения больших XML, расширенная версия поддерживает xml размером до 256 гб, также поддерживает mem-map и можно использовать xpath.   -  person vtd-xml-author    schedule 27.02.2011


Ответы (2)


Я не совсем уверен, что полностью понимаю, что вы пытаетесь сделать, но чтобы получить полное имя в виде строки, вы просто делаете qName.toString(), а чтобы получить имя атрибута, вы просто делаете atts.getQName(int index).

person Octavian A. Damiean    schedule 03.10.2010
comment
Спасибо за это. Теперь моя проблема заключается в том, что элементы содержат ссылки на символы xml, которые декодируются синтаксическим анализатором, поэтому я пишу › вместо . Любая идея, как обойти это? - person Richard H; 03.10.2010
comment
@Richard: если вы используете dom4j, как я предложил в своем ответе, он автоматически закодирует для вас эти специальные символы. Это еще одно преимущество использования библиотеки вместо самостоятельного написания XML-документов. - person Richard Fearn; 03.10.2010
comment
@ Ричард - да, согласен. спасибо за это и ваш ответ на мой другой вопрос. Я пытаюсь эхо напрямую без декодирования, а затем перекодирования, если это возможно. - person Richard H; 04.10.2010

Проблема здесь в том, что вы сами пишете XML-элементы. Взгляните на класс XMLWriter. из dom4j - хотя он немного устарел, он действительно упрощает вывод XML-документов вызвав его методы startElement и endElement.

person Richard Fearn    schedule 03.10.2010