Чтение и изменение и запись в большой файл XML (100 МБ) в JAVA [дубликат]

То, что вы описываете, называется разговорным языком Comet . Комета описывает группу методов для продвижения контента на веб-страницу с постоянным HTTP-соединением.

Пуск будет инициирован с использованием комбинации триггера / хранимой процедуры на сервере базы данных. Таким образом, это происходит независимо от того, откуда происходит обновление данных.

4
задан user1873190 12 December 2012 в 22:19
поделиться

3 ответа

Попробуйте выполнить

    XMLReader xr = new XMLFilterImpl(XMLReaderFactory.createXMLReader()) {
        private boolean skip;

        @Override
        public void startElement(String uri, String localName, String qName, Attributes atts)
                throws SAXException {
            if (qName.equals("rule")) {
                if (atts.getValue("id").equals("1")) {
                    skip = true;
                } else {
                    super.startElement(uri, localName, qName, atts);
                    skip = false;
                }
            } else {
                if (!skip) {
                    super.startElement(uri, localName, qName, atts);
                }
            }
        }

        public void endElement(String uri, String localName, String qName) throws SAXException {
            if (!skip) {
                super.endElement(uri, localName, qName);
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if (!skip) {
                super.characters(ch, start, length);
            }
        }
    };
    Source src = new SAXSource(xr, new InputSource("test.xml"));
    Result res = new StreamResult(System.out);
    TransformerFactory.newInstance().newTransformer().transform(src, res);

выход

<?xml version="1.0" encoding="UTF-8"?><ruleset>
    <rule id="2">
        <condition>
            <case2>somefunctionality</case2>
            <allow>false</allow>
        </condition>
    </rule>
</ruleset>
6
ответ дан Evgeniy Dorofeev 16 August 2018 в 00:58
поделиться
  • 1
    Это не всегда будет работать так, как ожидалось, так как SAX анализирует элементы последовательно - это означает, что если у вас есть два близких друг к другу тега рядом, метод endElement будет вызываться дважды и пропустится в соответствии с последним пропуском вызова (последним startElement) – Mike 13 April 2017 в 10:04

Что нужно построить, это буфер событий SAX.

, когда вы приходите, активируете элемент <rule>, вам нужно сохранить его (или информацию, необходимую для его восстановления), и все другое событие, которое происходит между ним и вашим «случаем», которое вы хотите Удалить.

Если сохраненное вами «правило» совпадает с тем, которое нужно удалить, просто выбросьте информацию и продолжайте.

Если сохраненное вами «правило» а не тот, который нужно удалить, вы должны восстановить события sax, которые были сохранены, и продолжить.

0
ответ дан Colin D 16 August 2018 в 00:58
поделиться

SAX чаще всего используется для чтения / разбора XML. Но есть статья о том, как использовать SAX для записи файлов. И, похоже, эта глава доступна в Интернете - см.

http://xmlwriter.net/sample_chapters/Professional_XML/31100604.shtml

[Статья датируется 1999 годом, поэтому используется старая версия SAX, но концепции все еще применяются]

Основная идея заключается в создании пользовательского DocumentHandler / ContentHandler. Всякий раз, когда он получает событие SAX, он сериализует и записывает событие в поток / файл / независимо. Таким образом, вы используете свой входной документ в качестве источника событий sax и пересылаете эти события в XMLOutputter.

Жесткая часть доходит до того, что вы можете анализировать XML-документ в потоке событий SAX, управлять XMLOutputter и генерировать точную копию входного файла. Как только вы начнете работать, вы можете перейти к логике редактирования, где вы читаете свои правила и используете их для изменения выходного файла.

Это намного больше, чем DOM, JDOM, XSLT и т. Д., Но это может помогите в вашей ситуации, потому что вам никогда не нужно хранить весь документ в памяти.

0
ответ дан Guido Simone 16 August 2018 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: