在python中加入一个xml文件节点

2024-10-03 06:31:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下XML文件:

<root>
    <scen name="n1">
        <case name="c1">
           <res>Text1</res>
        </case>
    </scen>
    <scen name="n2">
        <case name="c234">
           <res>Text</res>
        </case>
    </scen>
    <scen name="n1">
        <case name="c2">
           <res>Text1</res>
        </case>
        <case name="c1">
           <res>Text2</res>
        </case>
    </scen>
</root>

我想对它进行解析,并做出类似的事情:

<root>
    <scen name="n1">
        <case name="c1">
           <res>Text1</res>
           <res>Text2</res>
        </case>
        <case name="c2">
           <res>Text1</res>
        </case>
    </scen>
    <scen name="n2">
        <case name="c234">
           <res>Text</res>
        </case>
    </scen>
</root>

我更喜欢python,但我就是解决不了它。我尝试了许多选择,但没有一个奏效。也许有什么建议

def join(root):
    index = defaultdict(list)
    for scenario in root.findall(".//scenario"):
        index[scenario.get('name')].append(scenario.getchildren())
    nRoot = ET.Element('root')
    elems = []
    for i in index:
        scen = ET.Element('scenario',name=i)
        for elem in index[i]:
        for e in elem:
            scen.append(e)
        elems.append(scen)
    nRoot.extend(elems)
    return nRoot

数据集很大(root有大约1500个节点),但在使用此方法后,我复制了一些节点。而且案例节点仍然没有合并


Tags: nameinforindexresrootscenariocase
1条回答
网友
1楼 · 发布于 2024-10-03 06:31:25

如果case名称也相同,则不会由sceno.extend(s.getchildren())自动处理。请尝试此代码-

def join(root):
    nRoot = ET.Element(root.tag)
    for n in root:
        path = ".//scenario[@name='%s']" % n.attrib['name']
        scens = root.findall(path)
        if not scens:
            sceno = ET.SubElement(nRoot, 'scenario',names=n)
            sceno.extend(n.getchildren())
        else:
            sceno = scens[0]
            for c in n:
                cases = sceno.findall(".//case[@name='%s']"%c.attrib['name'])
                if cases:
                    sceno.extend(cases[0].getchildren())
                else:
                    sceno.append(c)
            sceno.extend(n.getchildren())
    return nRoot

相关问题 更多 >