Разбор и изменение XML-строки с помощью парсера sax

У меня есть XML-файл, мне нужно найти в нем определенный тег и обновить его значение. Проблема в том, что использование парсера Sax "обязательно". Мне нужно найти эти теги, используя "только" Sax Parser, dom stax j4dom парсеры dom4j не рассматриваются.

Могу ли я выполнить эту задачу, преобразовав мой xml-файл в строку, проанализируя ее с помощью синтаксического анализатора sax и добавив новое значение с помощью объекта StringBuilder? Было бы хорошо? Или что бы вы посоветовали?


person user1873190    schedule 03.12.2012    source источник
comment
проверьте ссылку http://stackoverflow.com/questions/4898590/generating-xml-using-sax-and-java   -  person Jiji    schedule 03.12.2012
comment
SAX не предназначен для изменения существующего XML. Почему дом и т. Д. Не принимаются во внимание?   -  person Aravind Yarram    schedule 03.12.2012
comment
почему саксофон необходим? это документ для нескольких гигабайт?   -  person vtd-xml-author    schedule 27.04.2016


Ответы (2)


Это рабочий код, просто добавьте недостающий импорт. Он использует SAX и меняет <name>user1</name> на <name>user2</name>. Если вы поймете, как это работает, и прочтете SAX API, вы сможете делать все, что угодно, со своим xml. Обратите внимание, что SAX считался наиболее эффективным парсером xml до появления StAX.

public static void main(String[] args) throws Exception {
    String xml = "<users><user><name>user1</name></user></users>";
    XMLReader xr = new XMLFilterImpl(XMLReaderFactory.createXMLReader()) {
        private String tagName = "";
        @Override
        public void startElement(String uri, String localName, String qName, Attributes atts)
                throws SAXException {
            tagName = qName;
            super.startElement(uri, localName, qName, atts);
        }
        public void endElement(String uri, String localName, String qName) throws SAXException {
            tagName = "";
            super.endElement(uri, localName, qName);
        }
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            if (tagName.equals("name")) {
                ch = "user2".toCharArray();
                start = 0;
                length = ch.length; 
            }
            super.characters(ch, start, length);
        }
    };
    Source src = new SAXSource(xr, new InputSource(new StringReader(xml)));
    Result res = new StreamResult(System.out);
    TransformerFactory.newInstance().newTransformer().transform(src, res);
}
person Evgeniy Dorofeev    schedule 03.12.2012
comment
это очень полезно, просто будьте осторожны с загрузкой правильного драйвера sax при использовании на разных платформах - person duckduckgo; 01.09.2013

Парсер SAX - неплохой выбор, если время не учитывается, а память важна.

person CodeDreamer    schedule 03.12.2012