web-dev-qa-db-fra.com

Génération de XML à l'aide de SAX et Java

Quelqu'un connaît un bon tutoriel (ou a un bon exemple) pour écrire XML en utilisant le framework SAX (ou quelque chose de similaire) et Java? La recherche a donné très peu de résultats utiles. J'essaie d'exporter à partir d'une application Android Android et je cherche à éviter autant de surcharge de mémoire que possible.

18
Lunchbox

Il existe une technique très utile pour générer XML directement à partir des POJO via le framework SAX (pas un analyseur SAX, mais le framework SAX). Cette technique pourrait être utilisée pour générer un document XML.

Génération de XML à partir d'une structure de données arbitraire
http://download.Oracle.com/javaee/1.4/tutorial/doc/JAXPXSLT5.html

Essentiellement, vous ajoutez des méthodes à votre POJO ou écrivez une classe utilitaire pour vos POJO qui les transforme en émetteurs d'événements SAX (l'émission d'événements comme un analyseur SAX le ferait normalement lors de l'analyse d'un document XML). Maintenant, votre "générateur d'événement SAX" ressemble au côté sortie d'un analyseur SAX et peut recevoir n'importe quel gestionnaire de contenu qu'un analyseur SAX prendrait, comme celui qui imprime pretyy XML. Mais il peut également être alimenté par un analyseur DOM pour générer une arborescence DOM ou alimenté par un moteur XSLT pour générer du HTML ou effectuer une véritable traduction XSL sans avoir à générer d'abord un document XML intermédiaire à partir des POJO.

Par exemple, une classe Person peut avoir une méthode emitXML() qui inclut ces lignes:

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);

Mise à jour:

Quelques autres références:


Quelques réponses aux commentaires:

C'est vrai, mais l'interface XMLStreamWriter décrite ci-dessus est beaucoup plus conviviale. - Michael Kay Il y a 3 heures

Oui, mais je suppose que je n'étais pas clair. Je pourrais facilement parcourir la hiérarchie et utiliser XMLStreamWriter pour sortir directement un document XML dans un flux. Cependant, les articles présentent une technique puissante pour parcourir la hiérarchie et générer des événements SAX, au lieu de générer directement un document XML. Maintenant, je peux brancher différents gestionnaires de contenu qui font des choses différentes ou génèrent différentes versions du XML. Nous pourrions également alimenter notre hiérarchie d'objets à n'importe quel outil qui accepte un analyseur SAX , comme un moteur XSLT. Il profite vraiment du modèle de visiteur établi par le framework SAX: nous séparons la traversée de la hiérarchie de la sortie du XML. Les parties qui produisent le XML, les gestionnaires de contenu, devraient certainement utiliser un XMLStreamWriter si leur but est d'écrire un flux XML.

Par exemple, sur notre programme, nous avons envoyé des messages XML sur des sockets réseau entre des composants distribués et nous avons également utilisé XSLT pour générer nos pages HTML. Auparavant, nous avons parcouru notre hiérarchie pour générer un document XML (une chaîne), puis nous avons écrit ce document XML dans une socket réseau ou envoyé ce document au moteur XSLT (qui l'a essentiellement simplement analysé à nouveau). Après avoir utilisé cette technique, nous pourrions essentiellement alimenter notre hiérarchie d'objets (à l'aide de cet adaptateur SAX) directement vers le moteur XSLT sans avoir besoin de la chaîne XML intermédiaire. Il était également pratique de pouvoir utiliser un gestionnaire de contenu pour générer une représentation XML compacte pour le flux réseau et en utiliser un autre pour générer un document XML assez imprimé pour l'écriture dans un fichier journal.

En outre, l'utilisation de l'API de l'analyseur SAX pour écrire du XML est une mauvaise utilisation de l'API, à mon humble avis. - Puce Il y a 49 minutes

Peut-être, mais je pense que cela dépend de vos besoins. Si l'exigence d'OP consiste simplement à écrire un document XML spécifique, cela est certainement exagéré. Cependant, j'ai pensé qu'il valait la peine de mentionner si l'OP utilise XML d'une autre manière sur son projet qu'il n'a pas mentionné. Il n'y a aucun mal à présenter une autre idée.

L'appeler abus peut être un peu fort, mais je reconnais que vous avez droit à votre opinion. Son documenté dans un tutoriel Oracle, donc ce n'est pas considéré comme un abus par les ingénieurs Sun/Oracle. Notre projet a été couronné de succès pour nous aider à répondre à nos exigences sans inconvénients importants, donc je garderai cette approche dans ma boîte à outils lorsqu'elle sera utile à l'avenir.

16
Bert F

L'analyse SAX sert à lire des documents, pas à les écrire.

Vous pouvez écrire du XML avec 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();
33
morja

Ci-dessous les réponses "un bon tutoriel pour écrire XML en utilisant l'analyseur SAX et Java" partie de la question

Je ne sais pas si vous avez vécu cela. Mais j'aime vraiment Java's Really Big Index of Everything .

Passez par là: http://download.Oracle.com/javase/tutorial/jaxp/index.html

Et finalement, ceci: http://download.Oracle.com/javase/tutorial/jaxp/sax/index.html

5
Nishant

Veuillez vous référer à mon article de blog personnel: Génération XML en Java - spécifiquement, La méthode SAX . Il fait référence à quelques autres articles à ce sujet, fournit un exemple concret et compare SAX avec les autres API populaires pour générer du XML à partir de Java.

(J'ai réalisé qu'il s'agissait d'une question plus ancienne, mais j'ai jugé nécessaire d'ajouter cette question à toute autre personne pouvant avoir la même question.)

4
ziesemer

Considérez également JAXB pour écrire/lire du XML.

3
Puce

Vous pouvez également passer au trax avec ceci:

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) {}
  }
}

Utilisez comme ça:

  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));
  }
1
slow