当前位置:  开发笔记 > 编程语言 > 正文

在Python中将XML编辑为字典?

如何解决《在Python中将XML编辑为字典?》经验,为你挑选了3个好方法。

我正在尝试从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') 

有没有办法做到这一点,或者有人建议以不同的方式这样做?



1> 小智..:

如果这对任何人都有用,那么这将给你一个减去属性的字典... 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


 Tove
 Jani
 Reminder
 Don't forget me this weekend!

等于这个:

{'note': [{'to': 'Tove'},
          {'from': 'Jani'},
          {'heading': 'Reminder'},
          {'body': "Don't forget me this weekend!"}]}



2> Torsten Mare..:

我不确定是否首先将信息集转换为嵌套dicts更容易.使用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树转换为列表和属性,因为它在内部使用完全相同.

它还支持XPath的小子集.



3> Chris Lawlor..:

为了在python中轻松操作XML,我喜欢Beautiful Soup库.它的工作原理如下:

示例XML文件:


  leaf1
  leaf2

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()
# 
#  
#   leaf1
#  
#  
#   leaf2
#  
#  
#   leaf3
#  
# 


BeautifulSoup将一切都转换为小写.真的太糟糕了.我必须保留标签和值的案例!
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有