XML, чтобы диктовать изменение имени тега в Python - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь преобразовать данные XML в данные словаря Python.xmltodict отлично работает с моим кодом.

ниже приведен пример:

  myxml = """
 <mydocument has="an attribute">
   <and>
     <many>elements</many>
     <many>more elements</many>
   </and>
   <plus a="complex">
     element as well
   </plus>
 </mydocument>
 """

, если я напишу data = xmltodict.parse (myxml) , тогда он работает нормально.но мой xml намного больше, чем этот, и я хочу переименовать все имя тега с плюс на children .и тогда выходной словарь будет содержать дочерний ключ вместо плюсового ключа.любые предложения просьбы ...

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Как я уже говорил выше, я бы предложил заменить строку plus на children, используя сопоставление с образцом.

import re

myxml = """
 <mydocument has="an attribute">
   <and>
     <many>elements</many>
     <many>more elements</many>
   </and>
   <plus a="complex">
     element as well
   </plus>
 </mydocument>
 """

myxml = re.sub('(?<=</)?plus', 'children', myxml)
print(myxml)

, что приводит к

 <mydocument has="an attribute">
   <and>
     <many>elements</many>
     <many>more elements</many>
   </and>
   <children a="complex">
     element as well
   </children>
 </mydocument>
0 голосов
/ 31 января 2019

Вы можете сначала переименовать тег <plus></plus>, используя такую ​​библиотеку, как ElementTree, а затем преобразовать в dict.Вот код:

import xml.etree.ElementTree as ET
import xmltodict
import json

myxml = """
 <mydocument has="an attribute">
   <and>
     <many>elements</many>
     <many>more elements</many>
   </and>
   <plus a="complex">
     element as well
   </plus>
 </mydocument>
 """
#rename tag
root = ET.fromstring(myxml)
for elem in root.iter('plus'):
    elem.tag = 'children'

newxml = ET.tostring(root, encoding='utf8', method='xml')
xml_dict = dict(xmltodict.parse(newxml)) #convert to Ordered dict and then a normal dict(optional, OrderedDict is returned by default if only using xmltodict)
print(json.dumps(xml_dict, indent=4)) #pretty print to view dict tree(optional)
#Output:
 {
    "mydocument": {
        "@has": "an attribute",
        "and": {
            "many": [
                "elements",
                "more elements"
            ]
        },
        "children": {
            "@a": "complex",
            "#text": "element as well"
        }
    }
}
...