2010-08-09 5 views
9

Ich möchte dies tun: 1. PUT eine XML-Zeichenfolge auf CouchDB-Server. so etwas wie:Wie lege ich ein xml in die CouchDB?

curl -X PUT http://localhost:5984/db/_design/app/_update/echo/h1 
-d "<doc><name1>value1</name1><name2>value2</name2></doc>" 
  1. am couchdb Server-Seite, ich analysieren, um die XML-Zeichenfolge in JSON-Objekt.
  2. Speichern Sie das JSON-Objekt als Dokument.

ist das möglich? wie soll ich tun?

danke!

Antwort

5

Ihre beste Wette wird sein, das XML in JSON zu konvertieren, bevor Sie es an CouchDB senden. Natürlich könnten Sie es auch nicht konvertieren und einfach in einem JSON-Feld speichern. Das Dokument könnte wie folgt aussehen:

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

Sie auch die XML als Anhang speichern könnte: http://wiki.apache.org/couchdb/HTTP_Document_API#Attachments diese Weise können Sie einen Anruf zu /dbName/documentID/storedData.xml oder was auch immer machen, und nutzen Sie die Datei wieder mit der richtigen XML-Content-type .

Es hängt wirklich davon ab, ob Sie XML zurückbekommen wollen oder ob Sie nach der Konvertierung nur mit dem JSON arbeiten wollen.

+0

Ich möchte den JSON bekommen. also Anhang ist nicht geeignet, vielleicht ist der beste Weg, ein Feld von JSON zu Xml auf den Server zu übertragen, aber es ist unbequem, wenn meine Xml enthalten so viele '"' Zeichen. Sie müssen manuell Escaped sein. – turtledove

+1

Sie sollten nicht entkommen müssen Sie können Ihren XML-Code in einen String umwandeln, der bereits so aussieht, wie er ist, und dann json_encode() ausführen. Er kümmert sich um das gesamte Entweichen und Formatieren für Sie. Außerdem könnten Sie das XML immer in PHP übersetzen Objekte (ziemlich einfache Operation), und führen Sie es dann durch json_encode() und speichern Sie das in Ihrem Dokument. –

6

fand ich eine andere Art und Weise, dies zu tun, hier Probe:

  1. create db

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

  2. erstellen Dokument Design

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

wo design.doc Inhalt ist:

{"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"

wo isbndb.sample Inhalt ist:

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