在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