解析XML元素的父/子关系

时间:2014-07-30 02:10:58

标签: python xml bash perl xml-parsing

给出以下XML(ant build 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 :(得分: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))