开发者

how to put a xml into couchDB?

开发者 https://www.devze.com 2023-01-10 22:47 出处:网络
i want to do this: 1. PUT a xml string to couchdb server. something li开发者_JS百科ke: curl -X PUThttp://localhost:5984/db/_design/app/_update/echo/h1

i want to do this: 1. PUT a xml string to couchdb server. something li开发者_JS百科ke:

curl -X PUT  http://localhost:5984/db/_design/app/_update/echo/h1
-d "<doc><name1>value1</name1><name2>value2</name2></doc>"
  1. at the couchdb server side, i parse the xml string into json object.
  2. save the json object as a document.

is this possible? how am i supposed to do?

thanks!


I found another way to do this, here is sample:

  1. create db

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

  2. create design document

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

where design.doc's content is:

{"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 = {};
                  doc._id=html.BookList.BookData.@isbn13.toString();
                  if(doc._id==null||doc._id==\"\") {
                    doc._id=html.BookList.BookData.@isbn.toString();
                  }
                }
                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"

where isbndb.sample's content is:

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


Your best bet is going to be to covert the XML into JSON before you send it to CouchDB. Of course, you could also not convert it and just store it in a JSON field. Your document might look something like this:

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

You could also store the XML as an attachment: http://wiki.apache.org/couchdb/HTTP_Document_API#Attachments That way you can make a call to /dbName/documentID/storedData.xml or whatever, and get the file back with the proper XML Content-type.

It really depends on whether you want to get XML back, or whether you want to only work with the JSON after the conversion.

0

精彩评论

暂无评论...
验证码 换一张
取 消