处理包含默认命名空间的XML时出现XPath问题

时间:2016-08-06 07:42:52

标签: python xml python-2.7 xpath lxml

XPath正在踢我的垃圾。我不确定为什么让它变得如此困难。我在下面粘贴我正在尝试的内容,以及文档中的一些引用。

已清理的文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Document>
        <Style id="PolyStyle70412"></Style>
        <Folder>
                <Placemark id="default_starting_location"></Placemark>
                <Folder>
                        <name>LandParcels</name>
                        <visibility>0</visibility>
                        <Folder>
                                <name>LandParcels batch 1-2</name>
                                <visibility>0</visibility>
                                <Document id="LandParcels" xsi:schemaLocation="http://www.opengis.net/kml/2.2 http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd http://www.google.com/kml/ext/2.2 http://code.google.com/apis/kml/schema/kml22gx.xsd">
                                        <name>LandParcels</name>
                                        <visibility>0</visibility>
                                        <Snippet maxLines="0"></Snippet>
                                        <description>text</description>
                                        <Style id="PolyStyle70"></Style>
                                        <Folder id="FeatureLayer7">
                                                <Placemark id="ID_70000">
                                                        <name>12345678</name>
                                                        <MultiGeometry>
                                                                <coordinates>100,200</coordinates>
                                                        </MultiGeometry>
                                                </Placemark>
                                        </Folder>
                                </Document>
                        </Folder>
                </Folder>
        </Folder>
</Document>
</kml>

问题和预期结果:

>>> from lxml import etree
>>> doc = etree.parse('/path/to/file.xml')
>>> print doc.xpath('Placemark') # Returns an empty list

根据the xpath syntax,上述内容应选择标记为“地标”的所有节点。

>>> print doc.xpath('//Placemark') # Returns an empty list

根据相同的来源,无论文档在何处,都应选择所有节点。

>>> print doc.xpath('/kml') # Returns an empty list

同样,这应该选择根节点......没有任何作用!

嗯,这很有效:

>>> print doc.xpath('/*') # Returns the kml node
>>> print doc.xpath('/*/*') # Returns the Document node

好的,所以我知道最后一个不是假设获取Document节点的方式,但是因为我们有它,我尝试从那里开始并向下钻取以获取坐标:

>>> print doc.xpath('/*/*/Folder/Folder/Folder/Document/Folder/Placemark/MultiGeometry/coordinates') # Returns an empty list

我也尝试了很多其他的事情。除了斜线星形语法之外什么都没有用?是的,我已经尝试了很多StackOverflow搜索,人们给出了玩具xml文件和一些代码,然后我将其粘贴并且有效。但是为什么我的文件不能得到任何好结果呢?

最终我试图提取这些节点:

/kml/Document/Folder/Folder/Folder/Document/description
/kml/Document/Folder/Folder/Folder/Document/Folder/Placemark/MultiGeometry/coordinates

0 个答案:

没有答案