在python中将XML编辑为字典?
时间:2020-03-06 14:40:01 来源:igfitidea点击:
我正在尝试从python中的模板xml文件生成自定义xml文件。
从概念上讲,我想读入xml模板,删除一些元素,更改一些文本属性,然后将新的xml写到文件中。我希望它能像这样工作:
conf_base = ConvertXmlToDict('config-template.xml') conf_base_dict = conf_base.UnWrap() del conf_base_dict['root-name']['level1-name']['leaf1'] del conf_base_dict['root-name']['level1-name']['leaf2'] conf_new = ConvertDictToXml(conf_base_dict)
现在我想写文件,但是我不知道如何去
ElementTree.ElementTree.write()
conf_new.write('config-new.xml')
有什么办法可以做到这一点,还是有人可以建议以其他方式做到这一点?
解决方案
我不确定首先将信息集转换为嵌套字典是否更容易。使用ElementTree,我们可以执行以下操作:
import xml.etree.ElementTree as ET doc = ET.parse("template.xml") lvl1 = doc.findall("level1-name")[0] lvl1.remove(lvl1.find("leaf1") lvl1.remove(lvl1.find("leaf2") # or use del lvl1[idx] doc.write("config-new.xml")
设计ElementTree的目的是,我们不必先将XML树转换为列表和属性,因为它在内部完全使用了XML树。
它还支持XPath的一小部分。
你有试过吗?
print xml.etree.ElementTree.tostring( conf_new )
为了方便地在python中处理XML,我喜欢Beautiful Soup库。它的工作原理如下:
样本XML文件:
<root> <level1>leaf1</level1> <level2>leaf2</level2> </root>
Python代码:
from BeautifulSoup import BeautifulStoneSoup, Tag, NavigableString soup = BeautifulStoneSoup('config-template.xml') # get the parser for the xml file soup.contents[0].name # u'root'
我们可以将节点名称用作方法:
soup.root.contents[0].name # u'level1'
也可以使用正则表达式:
import re tags_starting_with_level = soup.findAll(re.compile('^level')) for tag in tags_starting_with_level: print tag.name # level1 # level2
添加和插入新节点非常简单:
# build and insert a new level with a new leaf level3 = Tag(soup, 'level3') level3.insert(0, NavigableString('leaf3') soup.root.insert(2, level3) print soup.prettify() # <root> # <level1> # leaf1 # </level1> # <level2> # leaf2 # </level2> # <level3> # leaf3 # </level3> # </root>
如果我们对任何人都有用,这将为我们提供dict减去属性... dunno。当我想到这个时,我一直在寻找一个XML来自己决定解决方案。
import xml.etree.ElementTree as etree tree = etree.parse('test.xml') root = tree.getroot() def xml_to_dict(el): d={} if el.text: d[el.tag] = el.text else: d[el.tag] = {} children = el.getchildren() if children: d[el.tag] = map(xml_to_dict, children) return d
这个:http://www.w3schools.com/XML/note.xml
<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
等于:
{'note': [{'to': 'Tove'}, {'from': 'Jani'}, {'heading': 'Reminder'}, {'body': "Don't forget me this weekend!"}]}
最直接的方式给我:
root = ET.parse(xh) data = root.getroot() xdic = {} if data > None: for part in data.getchildren(): xdic[part.tag] = part.text