提问者:小点点

如何删除XML文件中所有出现的元素?


我想编辑一个KML文件,并删除所有ExtendedData元素的出现,无论它们位于文件中的任何位置。

以下是输入XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>

  <Style id="placemark-red">
    <IconStyle>
      <Icon>
        <href>http://maps.me/placemarks/placemark-red.png</href>
      </Icon>
    </IconStyle>
  </Style>

  <name>My track</name>

  <ExtendedData xmlns:mwm="https://maps.me">
    <mwm:name>
      <mwm:lang code="default">Blah</mwm:lang>
    </mwm:name>
    <mwm:lastModified>2020-04-05T14:17:18Z</mwm:lastModified>
  </ExtendedData>

  <Placemark>
    <name></name>
        …
    <ExtendedData xmlns:mwm="https://maps.me">
      <mwm:localId>0</mwm:localId>
      <mwm:visibility>1</mwm:visibility>
    </ExtendedData>
  </Placemark>
</Document>
</kml>

下面的代码1)只删除最外层的出现,2)需要添加名称空间来找到它:

from lxml import etree
from pykml import parser
from pykml.factory import KML_ElementMaker as KML

with open("input.xml") as f:
  doc = parser.parse(f)
root = doc.getroot()

ns = "{http://earth.google.com/kml/2.2}"

for pm in root.Document.getchildren():
    #No way to get rid of namespace, for easier search?
    if pm.tag==f"{ns}ExtendedData":
        root.Document.remove(pm)

    #How to remove innermost occurence of ExtendedData?

print(etree.tostring(doc, pretty_print=True))

有没有一种方法可以一次性删除所有的事件,或者我应该解析整个树?

谢谢。


共1个答案

匿名用户

下面是一个使用BeautifulSoup的解决方案:

soup = BeautifulSoup(my_xml) # this is your xml

while True: 
    elem = soup.find("extendeddata")
    if not elem:
        break
    elem.decompose()

以下是数据的输出:

<?xml version="1.0" encoding="UTF-8"?>
<html>
 <body>
  <kml xmlns="http://earth.google.com/kml/2.2">
   <document>
    <style id="placemark-red">
     <IconStyle>
      <Icon>
        <href>http://maps.me/placemarks/placemark-red.png</href>
      </Icon>
    </IconStyle>
    </style>
    <name>
     My track
    </name>
    <placemark>
     <name>
     </name>
    </placemark>
   </document>
  </kml>
 </body>
</html>