2010-08-09 8 views
9

Je veux faire ceci: 1. METTRE une chaîne XML sur le serveur couchdb. quelque chose comme:comment mettre un xml dans couchDB?

curl -X PUT http://localhost:5984/db/_design/app/_update/echo/h1 
-d "<doc><name1>value1</name1><name2>value2</name2></doc>" 
  1. du côté serveur CouchDB, je parse la chaîne XML en objet JSON.
  2. enregistrez l'objet json en tant que document.

est-ce possible? comment je suis supposé faire?

merci!

Répondre

5

Votre meilleur pari sera de convertir le XML en JSON avant de l'envoyer à CouchDB. Bien sûr, vous ne pouvez pas non plus le convertir et le stocker dans un champ JSON. Votre document pourrait ressembler à ceci:

{ 
    "_id": "...", 
    "_rev": "...", 
    "xml": "<doc><name1>value1</name1><name2>value2</name2></doc>", 
    ...some other fields... 
} 

Vous pouvez également stocker le XML comme une pièce jointe: http://wiki.apache.org/couchdb/HTTP_Document_API#Attachments De cette façon, vous pouvez faire un appel à /dbName/documentID/storedData.xml ou autre, et récupérer le fichier avec le type de contenu XML approprié .

Cela dépend vraiment si vous voulez récupérer XML ou si vous voulez travailler uniquement avec le JSON après la conversion.

+0

je veux obtenir le json. donc l'attachement ne convient pas, peut-être que la meilleure façon est d'utiliser un champ de json pour transférer xml vers le serveur, mais il est peu pratique quand mon xml inclut autant de caractères "", ils doivent être échappés manuellement – turtledove

+1

Il suffit de transformer votre code XML en une chaîne, dont il a déjà l'apparence, puis d'exécuter json_encode() .Il prendra soin de tous les fichiers d'échappement et de mise en forme pour vous.En outre, vous pouvez toujours traduire le XML en PHP objets (opération assez simple), puis exécutez-le via json_encode() et stockez-le dans votre document. –

6

J'ai trouvé une autre façon de le faire, voici échantillon:

  1. créer db

    boucle -X PUT http://localhost:5984/bookstore

  2. créer un document de conception

    boucle -X POST http://localhost:5984/bookstore/_bulk_docs -d @ design.doc

où le contenu de design.doc est:

{"docs": 
    [ 
    { 
     "_id": "_design/app", 
     "updates": { 
      "xml2json": " 
       function (doc, req) { 
       if(req.query.doc == null) { 
        return [null, \"doc is null!\\n\"]; 
       } 
       var xmlDoc = req.query.doc.replace(/^<\?xml\s+version\s*=\s*([\"'])[^\1]+\1[^?]*\?>/, \"\"); 
       var html = new XML(xmlDoc); 
       if(doc==null) { 
        doc = {}; 
        [email protected](); 
        if(doc._id==null||doc._id==\"\") { 
        [email protected](); 
        } 
       } 
       if (doc._id == null || doc._id == \"\") { 
        return [null, \"doc id is null!\\n\"];; 
       } 
       doc.title = html.BookList.BookData.Title.text(); 
       doc.longtitle = html.BookList.BookData.TitleLong.text(); 
       doc.authors = html.BookList.BookData.AuthorsText.text(); 
       doc.publisher = html.BookList.BookData.PublisherText.text(); 
       return [doc, \"ok!\\n\"]; 
       }" 
     } 
    } 
    ] 
} 
  1. Test _update

    doc=$(cat isbndb.sample); doc="$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$doc")"; curl -X PUT http://localhost:5984/bookstore/_design/app/_update/xml2json/9781935182320?doc="$doc"

où le contenu de isbndb.sample est:

<?xml version="1.0" encoding="UTF-8"?> 

<ISBNdb server_time="2010-08-11T04:13:08Z"> 
<BookList total_results="1" page_size="10" page_number="1" shown_results="1"> 
<BookData book_id="mastering_perl" isbn="0596527241" isbn13="9780596527242"> 
<Title>Mastering Perl</Title> 
<TitleLong></TitleLong> 
<AuthorsText>brian d foylt;/AuthorsText> 
<PublisherText publisher_id="oreilly_media">Sebastopol, CA : O'Reilly Media, c2007.</PublisherText> 
</BookData> 
</BookList> 
</ISBNdb>