Подтвердить что ты не робот

Создание XML с использованием SAX и Java

Кто-нибудь знает хороший учебник (или имеет хороший пример) для написания XML с использованием среды SAX (или чего-то подобного) и Java? Поиск принес очень мало с точки зрения полезных результатов. Я пытаюсь экспортировать из приложения для Android, и я стараюсь избегать как можно большего объема памяти.

4b9b3361

Ответ 1

Там очень полезный метод для генерации XML непосредственно из POJO через фреймворк SAX (не SAX-анализатор, а SAX-framework). Этот метод может быть использован для создания XML-документа.

Создание XML из произвольной структуры данных
http://download.oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT5.html

По существу, вы добавляете методы в свой POJO или записываете класс утилиты для POJO, которые превращают их в эмитентов событий SAX (при синтаксическом анализе XML-документа обычно возникают события, такие как SAX-парсер). Теперь ваш "генератор событий SAX" выглядит как выходная сторона синтаксического анализа SAX и может быть предоставлен любой обработчик содержимого, который будет принимать парсер SAX, например, тот, который pretyy печатает XML. Но он также может быть подан на парсер DOM для генерации дерева DOM или подачи в механизм XSLT для генерации HTML или выполнения истинного преобразования XSL без необходимости сначала генерировать промежуточный XML-документ из POJO.

Например, класс Person может иметь метод emitXML(), который включает следующие строки:

handler.startElement(nsu, PERSON_TAG, PERSON_TAG, NO_ATTRIBUTES);

handler.startElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG, atts);
handler.characters(this.firstName.toCharArray(), 
        0,
        this.firstName.length());
handler.endElement(nsu, FIRSTNAME_TAG, FIRSTNAME_TAG);

... emit more instance variables

... emit child object like: homeAddress.emitXML(handler, ...);

handler.endElement(nsu, PERSON_TAG, PERSON_TAG);

Update:

Несколько других ссылок:


Несколько ответов на комментарии:

Это верно, но описанный выше интерфейс XMLStreamWriter гораздо удобнее. - Майкл Кей 3 часа назад

Да, но я думаю, что я не был ясен. Я мог бы легко пройти иерархию и использовать XMLStreamWriter для непосредственного вывода XML-документа в поток. Тем не менее, в статьях показан мощный метод прохождения иерархии и генерации событий SAX, а не вывод XML-документа напрямую. Теперь я могу подключать разные обработчики контента, которые делают разные вещи или генерируют разные версии XML. Мы также могли бы кормить нашу иерархию объектов любым инструментом, который принял парсер SAX, например движок XSLT. Это действительно просто использование шаблона посетителя, установленного в рамках SAX: мы разделяем перемещение иерархии с вывода XML. Части, которые выводят XML, обработчики содержимого, обязательно должны использовать XMLStreamWriter, если их целью является запись XML-потока.

Например, в нашей программе мы отправили XML-сообщения через сетевые сокеты между распределенными компонентами, и мы также использовали XSLT для генерации наших HTML-страниц. Раньше мы проходили нашу иерархию для создания XML-документа (строки), а затем либо записывали этот XML-документ в сетевой сокет, либо передавали этот документ движку XSLT (который по существу просто разбирал его снова). После использования этого метода мы могли бы по существу перенести нашу иерархию объектов (используя этот SAX-адаптер) непосредственно на движок XSLT без необходимости использования промежуточной строки XML. Также было удобно использовать один обработчик контента для создания компактного представления XML для сетевого потока и использовать другой для создания довольно печатного документа XML для записи в файл журнала.

Кроме того, использование API-анализатора SAX для записи XML является неправильным использованием API, IMHO. - Puce 49 мин назад

Возможно, но я думаю, что это зависит от ваших потребностей. Если требование OP заключается только в том, чтобы выписать конкретный XML-документ, то это определенно излишне. Тем не менее, я думал, что стоит упомянуть, использует ли OP другой метод в своем проекте, о котором он не упоминал. Нет никакого вреда в подаче альтернативной идеи.

Вызов неправильного использования может быть немного сильным, но я согласен, что вы имеете право на свое мнение. Он документирован в учебнике Oracle, поэтому его не считают злоупотреблением инженерами Sun/Oracle. Это было очень успешным в нашем проекте, чтобы помочь нам удовлетворить наши требования без существенных минусов, поэтому я буду придерживаться такого подхода в своей панели инструментов, когда это будет полезно в будущем.

Ответ 2

Разбор SAX предназначен для чтения документов, а не для их записи.

Вы можете написать XML с помощью XMLStreamWriter:

OutputStream outputStream = new FileOutputStream(new File("doc.xml"));

XMLStreamWriter out = XMLOutputFactory.newInstance().createXMLStreamWriter(
                new OutputStreamWriter(outputStream, "utf-8"));

out.writeStartDocument();
out.writeStartElement("doc");

out.writeStartElement("title");
out.writeCharacters("Document Title");
out.writeEndElement();

out.writeEndElement();
out.writeEndDocument();

out.close();

Ответ 3

Ниже ответы "хороший учебник для написания XML с использованием парсера SAX и Java" часть вопроса

Я не уверен, что вы прошли через это. Но мне действительно нравится Java Really Big Index of Everything.

Пройдите через: http://download.oracle.com/javase/tutorial/jaxp/index.html

И со временем это: http://download.oracle.com/javase/tutorial/jaxp/sax/index.html

Ответ 4

Пожалуйста, обратитесь к моему личному сообщению в блоге: Генерация XML в Java - в частности, Метод SAX. Он ссылается на несколько других статей, касающихся этого, дает конкретный пример и сравнивает SAX с другими популярными API для генерации XML с Java.

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

Ответ 5

Также рассмотрим JAXB для записи/чтения XML.

Ответ 6

Вы также можете подключиться к трассе следующим образом:

public abstract class PipedSAXSource extends SAXSource {
  protected PipedSAXSource() {
    setXMLReader(new CallWriteDuringSax());
  }

  protected abstract void writeTo(ContentHandler sink)
      throws IOException, SAXException;

  private class CallWriteDuringSax extends XMLFilterImpl {
    @Override
    public void parse(InputSource ignored) throws IOException, SAXException {
      writeTo(getContentHandler());
    }

    @Override
    public void setFeature(String name, boolean value) {}
  }
}

Используйте так:

  public static void main(String[] args) throws Exception {
    Source in = new PipedSAXSource() {
      @Override
      protected void writeTo(ContentHandler sink) throws SAXException {
        sink.startDocument();

        sink.startElement("", "root", "root", new AttributesImpl());
        sink.endElement("", "root", "root");

        sink.endDocument();
      }
    };

    Transformer identity = TransformerFactory.newInstance().newTransformer();
    identity.transform(in, new StreamResult(System.out));
  }