解析XML元素的父子关系

0 投票
1 回答
747 浏览
提问于 2025-04-18 15:17

给定以下的XML(ant构建xml):

    <project name="pj1">
        <target name="t1">
            ...
            <antcall target="t2"/>
            <a>
                <antcall target="t4"/>
            </a>
            ...
        </target>
        <target name="t2">
            ...
            <antcall target="t3"/>
            ...
        </target>
        <target name="t3">
            ...
            ...
        </target>
        <target name="t4">
            ...
            <antcall target="t2"/>
            ...
        </target>
        <target name="t5">
            ...
            ...
        </target>
    </project>

我想以如下方式展示目标元素的父子关系(如果一个目标嵌套在另一个目标中,就不把它作为第一层元素显示)

t1
    t2
        t3
    t4
        t2
            t3
t5

有没有人能帮忙呢?

提前谢谢大家。

1 个回答

0

当我需要把一个XML树结构转换成其他形式时,我发现先把它转成一个抽象的表示方式,然后再转换成最终的具体形式,这样做很有帮助。

在这个例子中,我们首先创建一个字典,里面包含一些列表,这些列表代表了我们想要的依赖关系结构,然后我们把这个字典格式化得更好看。

#!/usr/bin/python

import xml.etree.ElementTree as ET
from itertools import chain

def parse(filename):
    tree = ET.parse(filename)
    root = tree.getroot()
    result = {}
    for target in root.findall('target'):
        target_name = target.get('name')
        result[target_name] = []
        for antcall in target.findall('.//antcall'):
            result[target_name].append(antcall.get('target'))
    return result

def display(tree):
    def recurse(node, indent):
        print "%*s%s"%(indent*4, "", node)
        for node in sorted(tree[node]):
            recurse(node, indent+1)
    for item in sorted(tree):
        if item in chain(*tree.values()): continue
        recurse(item,0)

if __name__=="__main__":
    import argparse
    parser = argparse.ArgumentParser(description='Dump ANT files')
    parser.add_argument('antfile',
                        nargs='+',
                        type=argparse.FileType('r'),
                        help='ANT build file')
    args = parser.parse_args()
    for antfile in args.antfile:
        display(parse(antfile))

撰写回答