11

xml を処理する dict クラスを作成しようとしていますが、スタックしてしまいます。本当にアイデアが不足しています。誰かがこの主題について導くことができれば素晴らしいでしょう.

これまでに開発されたコード:

class XMLResponse(dict):
    def __init__(self, xml):
        self.result = True
        self.message = ''
        pass

    def __setattr__(self, name, val):
        self[name] = val

    def __getattr__(self, name):
        if name in self:
            return self[name]
        return None

message="<?xml version="1.0"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>"
XMLResponse(message)
4

4 に答える 4

21

モジュールを利用できxmltodictます:

import xmltodict

message = """<?xml version="1.0"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>"""
print xmltodict.parse(message)['note']

を生成しますOrderedDict

OrderedDict([(u'to', u'Tove'), (u'from', u'Jani'), (u'heading', u'Reminder'), (u'body', u"Don't forget me this weekend!")])

順序が重要でない場合、これは dict に変換できます。

print dict(xmltodict.parse(message)['note'])

版画:

{u'body': u"Don't forget me this weekend!", u'to': u'Tove', u'from': u'Jani', u'heading': u'Reminder'}
于 2013-06-18T19:40:50.553 に答える
7

この時点で適切な回答が得られていると思われるかもしれませんが、そうではなかったようです。スタックオーバーフローに関する同様の質問の半ダースを確認した後、これが私のために働いたものです:

from lxml import etree
# arrow is an awesome lib for dealing with dates in python
import arrow


# converts an etree to dict, useful to convert xml to dict
def etree2dict(tree):
    root, contents = recursive_dict(tree)
    return {root: contents}


def recursive_dict(element):
    if element.attrib and 'type' in element.attrib and element.attrib['type'] == "array":
        return element.tag, [(dict(map(recursive_dict, child)) or getElementValue(child)) for child in element]
    else:
        return element.tag, dict(map(recursive_dict, element)) or getElementValue(element)


def getElementValue(element):
    if element.text:
        if element.attrib and 'type' in element.attrib:
            attr_type = element.attrib.get('type')
            if attr_type == 'integer':
                return int(element.text.strip())
            if attr_type == 'float':
                return float(element.text.strip())
            if attr_type == 'boolean':
                return element.text.lower().strip() == 'true'
            if attr_type == 'datetime':
                return arrow.get(element.text.strip()).timestamp
        else:
            return element.text
    elif element.attrib:
        if 'nil' in element.attrib:
            return None
        else:
            return element.attrib
    else:
        return None

これはあなたがそれを使用する方法です:

from lxml import etree

message="""<?xml version="1.0"?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>"''
tree = etree.fromstring(message)
etree2dict(tree)

それが役に立てば幸い :-)

于 2016-01-27T01:20:01.880 に答える
6

チェックアウトする必要があります

https://github.com/martinblech/xmltodict

これは、私が見た xml のディクテーションに最適な標準ハンドラーの 1 つだと思います。

ただし、xml と dict は完全に互換性のあるデータ構造ではないことに注意してください。

于 2013-06-18T19:32:21.133 に答える