解析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

python使用ElementTree解析XML文件

python 使用ElementTree解析xml

使用 ElementTree 示例在 Python 中解析 XML

使用ElementTree解析xml(python3.4)

python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别