【问题标题】:Lxml and python : iterate only over existing elementsLxml 和 python:仅迭代现有元素
【发布时间】:2021-04-30 13:41:38
【问题描述】:

我有一个包含 2 个地标的 KML 文件: 测试 1 和测试 2。

<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
  <Placemark>
    <name>Test1</name>
    <styleUrl>style1</styleUrl>
    <Point><coordinates>1,2</coordinates></Point>
    <ExtendedData xmlns:mwm="https://example">
      <mwm:visibility>1</mwm:visibility>
    </ExtendedData>
  </Placemark>
  <Placemark>
    <name>Test2</name>
    <styleUrl>style2</styleUrl>
    <Point><coordinates>3,4</coordinates></Point>
    <ExtendedData xmlns:mwm="https://example">
      <mwm:scale>19</mwm:scale>
      <mwm:visibility>1</mwm:visibility>
    </ExtendedData>
  </Placemark>
</Document>
</kml>

Test2 有一个元素 而 Test1 没有。

我的目标是遍历所有地标,并在一个列表中记录所有地标的名称,并在另一个列表中记录所有地标的比例。

我一直在研究 lxml 和 Xpath 选项,但是当地标(父元素)。

这段代码:

import lxml.etree as et
tree  = et.parse(file.kml)
for names in tree.xpath("/kml:kml/kml:Document/kml:Placemark/kml:name", namespaces={'kml': 'http://earth.google.com/kml/2.2','mwm': 'https://example'}):
  name_list.append(names.text)

for scales in tree.xpath("/kml:kml/kml:Document/kml:Placemark/kml:ExtendedData/mwm:scale", namespaces={'kml': 'http://earth.google.com/kml/2.2','mwm': 'https://example'}):
  scale_list.append(scales.text)

会给我那些清单

[Test1, Test2]

[19]

虽然我正在寻找解决方案来获得类似的东西(如果不存在规模,则输出“0”):

[Test1, Test2]

[0, 19]

任何解决方案或想法?我一直在尝试遍历解析的 XML,但是 2 个不同的命名空间(kml 和 mwm)使得我在论坛上找到的解决方案无法实现......

非常感谢您的帮助!

【问题讨论】:

    标签: python xpath namespaces lxml


    【解决方案1】:

    尝试以下方法:

    name_list = []
    scale_list = []
    ns = {'kml': 'http://earth.google.com/kml/2.2','mwm': 'https://example'}
    for name in tree.xpath("/kml:kml/kml:Document/kml:Placemark/kml:name", namespaces=ns):
        name_list.append(name.text)    
        scale =  name.xpath("following-sibling::kml:ExtendedData//mwm:scale", namespaces=ns)
        if len(scale)==0:
            scale_list.append("0")
        else:
            scale_list.append(scale[0].text)
    

    输出:

    (['Test1', 'Test2'], ['0', '19'])
    

    【讨论】:

    • 非常感谢!如果所有地标中都有一个“名称”,它确实有效。我稍微更改了您的代码以在“地标”上循环,以防万一也缺少一个“名称”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多