2010-08-09 13 views
9

quiero hacer esto: 1. PONGA una cadena xml al servidor de couchdb. algo así como:cómo poner un xml en couchDB?

curl -X PUT http://localhost:5984/db/_design/app/_update/echo/h1 
-d "<doc><name1>value1</name1><name2>value2</name2></doc>" 
  1. en el lado del servidor couchdb, i analizar la cadena XML en objeto JSON.
  2. guarde el objeto json como documento.

¿Esto es posible? ¿cómo se supone que debo hacer?

gracias!

Respuesta

5

Su mejor apuesta será convertir el XML en JSON antes de enviarlo a CouchDB. Por supuesto, tampoco podría convertirlo y simplemente almacenarlo en un campo JSON. El documento podría ser algo como esto:

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

También puede almacenar el XML como un archivo adjunto: http://wiki.apache.org/couchdb/HTTP_Document_API#Attachments esa manera usted puede hacer una llamada a /dbName/documentID/storedData.xml o lo que sea, y obtener el archivo de nuevo con el XML adecuado Content-type .

Realmente depende de si desea recuperar XML, o si solo desea trabajar con el JSON después de la conversión.

+0

quiero obtener el json. entonces el archivo adjunto no es adecuado, tal vez la mejor manera es usar un campo de json para transferir xml al servidor, pero es inconveniente cuando mi xml incluye tantos caracteres '' '. Se deben escapar manualmente. – turtledove

+1

No debería necesitar escapar de forma manual. Simplemente convierta su XML en una cadena, que ya se ve como es, y luego ejecute json_encode(). Se encargará de todo el escapado y el formato para usted. Además, siempre puede traducir el XML en PHP objetos (operación bastante simple), y luego ejecutarlo a través de json_encode() y almacenar eso en su documento. –

6

he encontrado otra manera de hacer esto, aquí está la muestra:

  1. crear db

    rizo -X PONER http://localhost:5984/bookstore

  2. crear documento de diseño

    rizo -X POSTAL http://localhost:5984/bookstore/_bulk_docs -d @ design.doc

donde el contenido de design.doc es:

{"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. _update prueba

    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"

donde el contenido de isbndb.sample es:

<?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>