IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XQUERY/SGBD XML Discussion :

[xmldb] écrire dans une base de données via un outputstream


Sujet :

XQUERY/SGBD XML

  1. #1
    Invité
    Invité(e)
    Par défaut [xmldb] écrire dans une base de données via un outputstream
    Bonjour à tous,

    J'écris actuellement un programme censé écrire un document xml dans une base de données eXist.

    Pour cela je dispose d'une classe qui génère le document puis prend en paramètre un OutputStream sur lequel le document sera écrit. Si on veut écrire dans un fichier c'est très simple, il suffit de donner un FileOutputStream en paramètre, mais là j'ai affaire à une base de données et je n'arrive pas à trouver dans l'API XMLDB ni dans l'API d'eXist de méthode permettant de récupérer un OutputStream sur un document en base.

    Quelqu'un connaîtrai-t-il un moyen d'obtenir un tel OutputStream ?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Salut,
    Regarde l'exemple "Example: Adding a File (XML:DB API)":
    http://exist.sourceforge.net/devguide_xmldb.html

    Dans l'exemple ils chargent un document xml du system de fichier, dans la base de donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     // create new XMLResource; an id will be assigned to the new resource  
             XMLResource document = (XMLResource)col.createResource(null, "XMLResource");  
             File f = new File(file);  
             if(!f.canRead()) {  
                 System.out.println("cannot read file " + file);  
                 return;  
             }  
             document.setContent(f);
    C'est cette partie que tu devras modifier pour charger un document xml depuis la mémoire.
    Tout ce que tu as à faire c'est écrire ton document xml avec ta méthode habituelle vers un ByteArrayOutputStream.
    Puis charger ce ByteArrayOutputStream en tant que org.w3c.dom.Document
    Puis utiliser la méthode
    setContentAsDOM(org.w3c.dom.Node) pour charger ce document dans ton XMLResource qui pointe vers la base eXist.
    Bon courage.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ça correspond pas vraiment a mes besoins, mais je vais faire avec pour le moment.
    En réalité on utilise des OutputStream parce que les documents xml traités sont en général très gros et si on se met à faire du multithreading ce sera pas très efficace d'attendre que tout le document soit créé, le mettre dans un arbre DOM et tout balancer d'un coup dans la BDD. Ce que je cherche c'est une solution pour vraiment écrire en streaming dans ma BDD eXist.

    Néanmoins il y a une chose que je n'arrive pas à faire pour la solution temporaire : charger mon ByteArrayOutputStream dans un org.w3c.dom.Document. Tu t'y prends comment ?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Il semble exister setContentAsSAX() pour charger le document de façon évenementiel qui est plus adapté au gros document que la méthode DOM.
    C'est du streaming au niveau des noeuds, et non plus des octets d'un fichier.

    Et pour répondre à ta question :
    http://faq.javaranch.com/java/ByteArrayToDocument
    La classe IOUtils d'apache common est très utile également.

    Dans ton premier post, tu dis "OutputStream sur lequel le document sera écrit".
    Si tu possedes déja le document SAX en mémoire, pas besoin de passer par un outputstream.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Effectivement, travailler avec le "streaming" SAX sera sans doute mieux. Il va falloir que je modifie un petit peu mes interfaces, mais comme le composant principal utilise SAX ça devrait pas être trop dur.

    Je vais donc explorer cette voie.

Discussions similaires

  1. [MySQL] écrire dans une base de données à partir d'un array asso
    Par tinkerbell dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/05/2009, 15h35
  2. Réponses: 5
    Dernier message: 10/05/2008, 17h26
  3. Comment écrire dans une base de données ODBC via Excel (VBA)
    Par Shark777 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/04/2008, 04h56
  4. Réponses: 7
    Dernier message: 26/05/2007, 15h14
  5. [MySQL] Envoi d'information dans une base de donnée via formulaire
    Par Mysti¢ dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 30/03/2006, 20h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo