解析XML:Python ElementTree,查找元素及其父元素,而同一父元素中没有其他元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析XML:Python ElementTree,查找元素及其父元素,而同一父元素中没有其他元素相关的知识,希望对你有一定的参考价值。
我正在使用python的ElementTree库来解析具有以下结构的XML文件。我正在尝试获取与ID = 192且具有其所有父项(文件夹)但没有其他实体的实体相对应的xml字符串
<catalog>
<folder name="entities">
<entity id="102">
</entity>
<folder name="newEntities">
<entity id="192">
</entity>
<entity id="2982">
</entity>
</folder>
</folder>
</catalog>
所需的结果应该是
<catalog>
<folder name="entities">
<folder name="newEntities">
<entity id="192">
</entity>
</folder>
</folder>
</catalog>
假设第一个xml字符串存储在名为xml_string的变量中
tree = ET.fromstring(xmlstring)
id = 192
required_element = tree.find(".//entity[@id='" + id + "']")
这将获取所需实体的xml元素,而不是父文件夹的xml元素,对此是否有任何快速的解决方案?
答案
这里的挑战是绕过ET没有父母信息的事实。解决方法是使用parent_map
import copy
import xml.etree.ElementTree as ET
import xml.dom.minidom as minidom
xml = '''<catalog>
<folder name="entities">
<entity id="102">
</entity>
<folder name="newEntities">
<entity id="192">
</entity>
<entity id="2982">
</entity>
</folder>
</folder>
</catalog>'''
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
root = ET.fromstring(xml)
parent_map = {c: p for p in root.iter() for c in p}
_id = 192
required_element = root.find(".//entity[@id='" + str(_id) + "']")
_path = [copy.deepcopy(required_element)]
while True:
parent = parent_map.get(required_element)
if parent:
_path.append(copy.deepcopy(parent))
required_element = parent
else:
break
idx = len(_path) - 1
while idx >= 1:
_path[idx].clear()
_path[idx].append(_path[idx-1])
idx -= 1
print(prettify(_path[-1]))
输出
<?xml version="1.0" ?>
<catalog>
<folder>
<folder>
<entity id="192">
</entity>
</folder>
</folder>
</catalog>
以上是关于解析XML:Python ElementTree,查找元素及其父元素,而同一父元素中没有其他元素的主要内容,如果未能解决你的问题,请参考以下文章
python xml解析之 xml.etree.ElementTree
使用 ElementTree 示例在 Python 中解析 XML
python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别