2015-11-09 97 views
1

我有一个KML文件KML文件 - 我使用的wikipedia 'default'作为样本:解析使用LXML

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> 
<Document> 
<Placemark> 
    <name>New York City</name> 
    <description>New York City</description> 
    <Point> 
    <coordinates>-74.006393,40.714172,0</coordinates> 
    </Point> 
</Placemark> 
</Document> 
</kml> 

而且我想提取的坐标。

现在,我已经得到了嵌入的命名空间的一个片段工作搜索:

#!/usr/python/python3.4/bin/python3 

from lxml import etree as ET 

tree = ET.parse('sample.kml') 
root = tree.getroot 

print (root.find('.//{http://www.opengis.net/kml/2.2}coordinates').text) 

这工作得很好。

但是已经发现这一点:

Parsing XML with namespace in Python via 'ElementTree'

我试图通过从文件中读取的命名空间去做,用“root.nsmap”。

print (root.nsmap) 

给我:

{None: '{http://www.opengis.net/kml/2.2}'} 

所以我觉得我应该能够做到这一点:

print (root.find('.//coordinates',root.nsmap).text) 

或者非常类似的东西,使用None命名空间。 (例如没有前缀)。但是,这并不工作 - 我做的,当它得到一个错误:

AttributeError: 'NoneType' object has no attribute 'text' 

我认为这意味着我在这种情况下“查找”没有发现任何东西。

缺少什么我在这里?

回答

1

此代码,

​​

,因为不使用前缀不返回任何东西。见http://lxml.de/xpathxslt.html#namespaces-and-prefixes

下面是两个选项的工作。

  1. 定义一个真正的前缀另一nsmap关键:

    nsmap2 = {"k": root.nsmap[None]} 
    print (root.find('.//k:coordinates', nsmap2).text) 
    
  2. 不要理会前缀。把花括号(“克拉克表示法”)中的命名空间URI,形成一个通用的元素名称:

    ns = root.nsmap[None] 
    print (root.find('.//{{{0}}}coordinates'.format(ns)).text)