如何在xml文件中使用python元素树删除子节点的子节点



我是xml编码的初学者。我目前使用Python元素树进行编码。我的xml文件如下所示

<net>
<edge id=":1006232713_w0" function="walkingarea">
<lane id=":1006232713_w0_0" index="0" allow="pedestrian" speed="1.00" />
<lane id=":1006232713_w0_1" index="0" disallow="pedestrian" speed="1.00"/>      
</edge>
<edge id=":1006237429_0" function="internal">
<lane id=":1006237429_0_0" index="0" allow="delivery bicycle" speed="5.69"/>
</edge>
<edge id=":1006237429_1" function="internal">
<lane id=":1006237429_1_0" index="0" allow="pedestrian" speed="3.65"/>
</edge>
<edge id=":1006237429_w0" function="walkingarea">
<lane id=":1006237429_w0_0" index="0" allow="pedestrian" speed="1.00"/>
<lane id=":1006237429_w0_0" index="0" disallow="pedestrian" speed="5.50"/>
</edge>
<edge id=":1006249156_w0" function="walkingarea">
<lane id=":1006249156_w0_0" index="0" allow="pedestrian" speed="1.00"/>
</edge>
<edge id=":1006249161_w0" function="walkingarea">
<lane id=":1006249161_w0_0" index="0" disallow="pedestrian" speed="1.00"/>
</edge>

</net>

在xml中,有子元素"edge"edge的子元素是lane">要求:我想保留这条"小巷"它的属性是allow="然后删除另一条车道。如果边缘下的车道不允许行人通行;属性,然后我想删除相应的边缘和车道

期望输出值

<net>
<edge id=":1006232713_w0" function="walkingarea">
<lane id=":1006232713_w0_0" index="0" allow="pedestrian" speed="1.00" />        
</edge>
<edge id=":1006237429_w0" function="walkingarea">
<lane id=":1006237429_w0_0" index="0" allow="pedestrian" speed="1.00"/>
</edge>
<edge id=":1006249156_w0" function="walkingarea">
<lane id=":1006249156_w0_0" index="0" allow="pedestrian" speed="1.00"/>
</edge>

</net>

我试图找到具有allow="pedestrian"属性的车道id使用下面的编码

for edge in root.findall("./edge/lane/[@allow= 'pedestrian']..."):
for lane in edge.find("./lane/[@allow= 'pedestrian']..."):
print(lane.attrib['id'])

正确打印出边缘id,但是打印出边缘下的车道id。我只想选取具有allow="pedestrian"属性的车道下边并删除另一条车道。如果边缘下的车道不允许行人通行;属性,然后我想删除相应的边和巷如果有人能解决这个问题,那就太有帮助了。

我会选择lxml而不是ElementTree,因为它有更好的xpath支持。

注意:答案假设实际的文件结构与你的问题完全相同。否则,答案可能无法正常工作。

所以尝试这样做(尽管在您的情况下,您将不得不解析文件,而不是像下面这样从字符串加载):

from lxml import etree
nets = """[your xml above]"""
doc = etree.fromstring(nets)
for edge in doc.xpath('//edge'):
target = edge.xpath('.//lane[@allow="pedestrian"]')
if target:
to_del=(target[0].xpath('following-sibling::lane'))
if to_del:
to_del[0].getparent().remove(to_del[0])
else:
edge.getparent().remove(edge)
print(etree.tostring(doc).decode())

输出应该是你期望的输出。

相关内容

  • 没有找到相关文章

最新更新