Java: разделение большого XML-файла с помощью SAXParser - PullRequest
2 голосов
/ 03 октября 2010

Я пытаюсь разбить большой 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 - что кажется немного болезненным.Или есть более простой способ?

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

Спасибо

Ответы [ 2 ]

1 голос
/ 03 октября 2010

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

0 голосов
/ 03 октября 2010

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

...