0

使用して作成する python オブジェクトのセットがありますeulxml.xmlmap.XmlObject(主にこの方法を使用するのは、eXistDB サーバーで作業しており、eulxml が非常に簡単なマッピング機能を提供するためです)。eXistDB を正常にクエリし、作成したいくつかの python オブジェクトに xquery 結果セットをロードできます。私の問題は、これらのオブジェクトをWebサーバーに渡すときに、これらのオブジェクトをJSONとして書き出せるようにしたいことです(フロントエンドにAngularを使用)。

jsonpickle を使用してみましたが、eulxml がある種の遅延読み込みマジックを行っているようです。オブジェクトを json にシリアル化するために jsonpickle を標準的に呼び出すと、次の結果が得られます。

パイソンコード:

jsonpickle.encode(myObject)

結果:

"py/object": "models.alcalaPage.AlcalaPage", "context": 
{"namespaces": 
   {"exist": "http://exist.sourceforge.net/NS/exist"}
}, 
"node":  {
   "py/object": "lxml.etree._Element", 
   "py/seq": [
       {"py/object": "lxml.etree._Comment", "py/seq": []},
       {"py/object": "lxml.etree._Element", "py/seq": []},
       ...
    ]
   }... 

属性のタイプのみを出力しているようで、属性自体の値は出力していないようです。jsonpickle コードを unpickable=False に設定するように変更すると、得られるのは json の空のセットだけです (つまり、正しい数の中括弧と括弧に関して構造は存在しますが、文字通りデータはありません。json の出力は次のとおりです。中括弧と括弧のみ)。

フィールドの値にアクセスしようとして、(少なくともアクセスしたフィールドでは) 動作する可能性のある json を出力しようとすると、おそらくうまくいかないと思いました。上記と同じ結果が得られます (オブジェクト自体にデータがあることを再確認しました)。

私はこの時点で途方に暮れています。BeautifulSoup のようなものに移行することもできますが、それはさらに多くのコードを記述することを意味します (eulxml を使用すると、属性に入力する値への xpath を指定するだけで済みます)。jsonpickle に欠けているものはありますか? または、私が見るべき別のjsonパッケージがありますか? または、この方法を必要以上に難しくしている可能性があります.Pythonを使用してeXistDBにクエリを実行し、Angularを使用して構築されたフロントエンドアプリケーションに情報を送信する別の方法があります. 私は提案を受け入れます。

以下にコードのサンプルを含めます (おそらく 10 以上のオブジェクトを扱っているため、すべては含めません)。

eulxml を使用したサンプル オブジェクト コード:

import jsonpickle
from eulxml.xmlmap import XmlObject


class AlcalaBase(XmlObject):

    def to_xml(self):
        return self.serializeDocument(pretty=True)

    def to_json(self):
        return jsonpickle.encode(self)

from eulxml import xmlmap
from models.alcalaBase import AlcalaBase

class AlcalaPage(AlcalaBase):
    ROOT_NAME = 'page'
    id = xmlmap.StringField('pageID')
    archive_page_number = xmlmap.StringField('archivistsPageNumber')
    year = xmlmap.IntegerField('content/@yearID')
4

2 に答える 2

0

はい、jsonpickle はdictメソッドを呼び出して動作するようにします。メタ クラスで以下を使用できます。

class MyXmlObject(XmlObject):
    @property
    def __dict__(self):
        d = { 'ROOT_NAME': self.ROOT_NAME }
        for key, value in self._fields.items():
            if isinstance(value, fields.Field):
                if isinstance(value, fields.NodeListField):
                    d[key] = [x.__dict__ for x in getattr(self, key)]
                elif isinstance(value, fields.NodeField):
                    d[key] = getattr(self, key).__dict__
                else:
                    d[key] = getattr(self, key)
        return d

そのため、dictメソッドはフィールドの値を直接返します

于 2019-10-22T12:56:19.127 に答える