【问题标题】:lxml - how to move elements into a folder based on a certain attributelxml - 如何根据某个属性将元素移动到文件夹中
【发布时间】:2021-04-04 07:03:48
【问题描述】:

我有一个包含大量地标和 2 个文件夹的 KML。 如何使用 etree 定位每个地标并将其移动到相应的文件夹中。 例如,代码应查找元素“SimpleData name='id'”并选择“Region 1”,然后将整个 Plaemark 移动到文件夹 Area 1。

之前:

<Folder>
    <name>Cluster</name>
    <Folder>Area 1</Folder>
    <Folder>Area 2</Folder>
    <Placemark>
        <styleUrl>#falseColor9</styleUrl>
        <name>Customer 1</name>
        <ExtendedData>
            <SimpleData name="id">Region 1</SimpleData>
        </ExtendedData>
    </Placemark>
    <Placemark>
        <styleUrl>#falseColor8</styleUrl>
        <name>Customer 1</name>
        <ExtendedData>
            <SimpleData name="id">Region 2</SimpleData>
        </ExtendedData>
    </Placemark>    
</Folder>

之后:

<Folder>
    <name>Cluster</name>
    <Folder>Area 1</Folder>
        <Placemark>
            <name>Customer 1</name>
            <styleUrl>#falseColor9</styleUrl>           
            <ExtendedData>
                <SimpleData name="id">Region 1</SimpleData>
            </ExtendedData>
        </Placemark>
    <Folder>Area 2</Folder>
        <Placemark>
            <styleUrl>#falseColor8</styleUrl>
            <name>Customer 1</name>
            <ExtendedData>
                <SimpleData name="id">Region 2</SimpleData>
            </ExtendedData>
        </Placemark>    
</Folder>

任何帮助将不胜感激。

【问题讨论】:

  • 不知道用xml.etree能不能做,但是用lxml可以做,如果能用的话。
  • @JackFleeting,你能给我一些想法吗?

标签: python lxml xml.etree parse-tree


【解决方案1】:

使用 lxml,可以这样完成:

from lxml import etree
marks = """[your xml above]"""
doc = etree.XML(marks.encode())
for region in doc.xpath('//SimpleData'):
    target = region.text.split(' ')[1].strip()
    dests = doc.xpath('//Folder//Folder')
    for dest in dests:
        if target in dest.text:
            move =region.xpath('ancestor::Placemark')[0]
            dest.addnext((move))
print(etree.tostring(doc).decode())

输出:

<Folder>
   <name>Cluster</name>
   <Folder>Area 1</Folder>
    <Placemark>
      <styleUrl>#falseColor9</styleUrl>
      <name>Customer 1</name>
      <ExtendedData>
         <SimpleData name="id">Region 1</SimpleData>
      </ExtendedData>
   </Placemark>
   
   <Folder>Area 2</Folder>
   <Placemark>
      <styleUrl>#falseColor8</styleUrl>
      <name>Customer 1</name>
      <ExtendedData>
         <SimpleData name="id">Region 2</SimpleData>
      </ExtendedData>
   </Placemark>
   </Folder>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    相关资源
    最近更新 更多