【问题标题】:how to put a xml into couchDB?如何将xml放入couchDB?
【发布时间】:2010-08-09 06:49:50
【问题描述】:

我想这样做: 1. 将 xml 字符串放入 couchdb 服务器。类似:

curl -X PUT  http://localhost:5984/db/_design/app/_update/echo/h1
-d "<doc><name1>value1</name1><name2>value2</name2></doc>"
  1. 在couchdb服务器端,我将xml字符串解析成json对象。
  2. 将 json 对象保存为文档。

这可能吗?我该怎么办?

谢谢!

【问题讨论】:

    标签: xml couchdb


    【解决方案1】:

    我找到了另一种方法,这里是示例:

    1. 创建数据库

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

    2. 创建设计文档

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

    design.doc 的内容在哪里:

    {"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. 测试_更新

      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"

    isbndb.sample 的内容在哪里:

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

    【讨论】:

      【解决方案2】:

      最好的办法是在将 XML 发送到 CouchDB 之前将其转换为 JSON。当然,您也可以不对其进行转换而将其存储在 JSON 字段中。您的文档可能如下所示:

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

      您还可以将 XML 存储为附件:http://wiki.apache.org/couchdb/HTTP_Document_API#Attachments 这样您就可以调用 /dbName/documentID/storedData.xml 或其他任何内容,并使用正确的 XML 内容类型取回文件。

      这实际上取决于您是想取回 XML,还是只想在转换后使用 JSON。

      【讨论】:

      • 我想获取 json。所以附件不适合,也许最好的方法是使用json字段将xml传输到服务器,但是当我的xml包含这么多'"'字符时很不方便。它们必须手动转义。
      • 您不需要手动转义它们。只需将您的 XML 转换成一个字符串,它看起来就是这样,然后运行 ​​json_encode()。它会为你处理所有的转义和格式化。此外,您始终可以将 XML 转换为 PHP 对象(相当简单的操作),然后通过 json_encode() 运行它并将其存储在您的文档中。
      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 2014-01-30
      • 1970-01-01
      相关资源
      最近更新 更多