Sie können die lxml-Bibliothek verwenden. Konvertieren Sie den String in ein XML-Objekt mit objectify.fromstring
und sehen Sie dann die Objekte mit der dir-Methode nach. Zum Beispiel:
from lxml import objectify
xml_string = """R7000000058940031AMEX3456732800000010TESTORDER155A69B278025130CD36B3A95435AA84DC453631001A51C5B2B1811E5991208BOB STEVEN0Profile Created13055"""
xml_object = objectify.fromstring(xml_string)
print xml_object.__dict__
Wenn Sie das XML-Objekt in ein Dictionary konvertieren, erhalten Sie folgendes Dictionary:
{'RemainingBalance': u'', 'AVSRespCode': u'', 'RequestedAmount': u'', 'AccountNum': 3456732800000010, 'IsoCountryCode': u'', 'HostCVV2RespCode': u'', 'TerminalID': 31, 'CVV2RespCode': u'', 'RespMsg': u'', 'CardBrand': 'AMEX', 'MerchantID': 700000005894, 'RespCode': u'', 'ProfileProcStatus': 0, 'CustomerName': 'BOB STEVEN', 'PartialAuthOccurred': u'', 'MessageType': 'R', 'ProcStatus': 0, 'TxRefIdx': 10, 'RecurringAdviceCd': u'', 'IndustryType': u'', 'OrderID': 'TESTORDER1', 'StatusMsg': u'', 'ApprovalStatus': 1, 'RedeemedAmount': u'', 'CountryFraudFilterStatus': u'', 'TxRefNum': '55A69B278025130CD36B3A95435AA84DC45363', 'CustomerRefNum': 'A51C5B2B1811E5991208', 'CustomerProfileMessage': 'Profile Created', 'AuthCode': u'', 'RespTime': 13055, 'HostAVSRespCode': u'', 'CAVVRespCode': u'', 'HostRespCode': u''}
Der XML-String, den ich verwendet habe, ist eine Antwort von Paymentech Payments Gateway, nur um ein reales Beispiel zu zeigen.
Beachten Sie auch, dass das obige Beispiel nicht rekursiv ist. Wenn es sich um Dictionarys in Dictionarys handelt, müssen Sie etwas Rekursion verwenden. Sehen Sie die rekursive Funktion, die ich geschrieben habe und die Sie verwenden können:
from lxml import objectify
def xml_to_dict_recursion(xml_object):
dict_object = xml_object.__dict__
if not dict_object:
return xml_object
for key, value in dict_object.items():
dict_object[key] = xml_to_dict_recursion(value)
return dict_object
def xml_to_dict(xml_str):
return xml_to_dict_recursion(objectify.fromstring(xml_str))
xml_string = """
Test1234
3455"""
print xml_to_dict(xml_string)
Hier ist eine Variante, die den Elternschlüssel/-element erhält:
def xml_to_dict(xml_str):
"""XML in ein Dictionary umwandeln, unter Verwendung der XML-Verarbeitungsbibliothek lxml v3.4.2, siehe http://lxml.de/"""
def xml_to_dict_recursion(xml_object):
dict_object = xml_object.__dict__
if not dict_object: # wenn ein leeres Dictionary zurückgegeben wird
return xml_object
for key, value in dict_object.items():
dict_object[key] = xml_to_dict_recursion(value)
return dict_object
xml_obj = objectify.fromstring(xml_str)
return {xml_obj.tag: xml_to_dict_recursion(xml_obj)}
Und wenn Sie nur einen Teilbaum zurückgeben und ihn in ein Dictionary konvertieren möchten, können Sie Element.find() verwenden:
xml_obj.find('.//') # lxml.objectify.ObjectifiedElement Instanz
Es gibt viele Möglichkeiten, dies zu erreichen, aber diese ist großartig, wenn Sie bereits lxml verwenden. In diesem Beispiel wurde lxml-3.4.2 verwendet. Prost!