xpath - 如何在空命名空间节点上使用来自 lxml 的 xpath?

标签 xpath lxml xml-namespaces

使用 lxml 处理 xml 文档中某些节点上缺少命名空间的最佳方法是什么?我应该首先修改所有无命名节点以添加“gmd”名称,然后将树属性更改为名称 http://www.isotc211.org/2005/gmd作为“gmd”?如果是这样,是否有一种干净的方法可以使用 lxml 或其他相对干净/安全的方法来做到这一点?

from lxml import etree
nsmap = charts_tree.nsmap
nsmap.pop(None) # complains without this on the xpath with
# TypeError: empty namespace prefix is not supported in XPath
len (charts_tree.xpath('//*/gml:Polygon',namespaces=nsmap))
# 1180
len (charts_tree.xpath('//*/DS_DataSet',namespaces=nsmap))
# 0 ... Bummer!
len (charts_tree.xpath('//*/DS_DataSet'))
# 0 ... Also a bummer

例如http://www.charts.noaa.gov/ENCs/ENCProdCat_19115.xml
<DS_Series xmlns="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gsr="http://www.isotc211.org/2005/gsr" xmlns:gss="http://www.isotc211.org/2005/gss" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd">
<composedOf>
    <DS_DataSet>
        <has>
            <MD_Metadata>
                <parentIdentifier>
                    <gco:CharacterString>NOAA ENC Product Catalog</gco:CharacterString>
                </parentIdentifier>
...
<EX_BoundingPolygon>
    <polygon>
        <gml:Polygon gml:id="US1AK90M_P1">
            <gml:exterior>
                <gml:LinearRing>
                    <gml:pos>67.61505 -178.99979</gml:pos>
                    <gml:pos>73.99999 -178.99979</gml:pos>
...
                    <gml:pos>64.99997 -178.99979</gml:pos>
                    <gml:pos>67.61505 -178.99979</gml:pos>
                </gml:LinearRing>

最佳答案

我相信您的 DS_DataSet 是由于在 DS_Series 内(暗示默认命名空间为“http://www.isotc211.org/2005/gmd”)携带命名空间。

尝试将其映射到您的命名空间字典中(您可能首先通过打印进行测试以查看它是否已经在那里,否则添加它并通过您的新键引用命名空间)。

nsmap['some_ns'] = "http://www.isotc211.org/2005/gmd"
len (charts_tree.xpath('//*/some_ns:DS_DataSet',namespaces=nsmap))

变成:
nsmap['gmd'] = nsmap[None]
nsmap.pop(None)
len(charts_tree.xpath('//*/gmd:DS_DataSet',namespaces=nsmap))

关于xpath - 如何在空命名空间节点上使用来自 lxml 的 xpath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6920073/

相关文章:

java - 对象未突出显示,尽管它在 Chrome 开发人员工具中显示为唯一

python - 如何在 python XPath 中连接 br 中的字符串?

python - 如何在使用selenium时每次在scrapy xpath中更新新的页面源?

python - 使用lxml解析html文档时出现编码问题

actionscript-3 - as3 命名空间 - 获取其中带有减号的属性

xml - XPath 如何处理 XML namespace ?

java - 使用 Java 修改 XML 中的一些字段的最佳方法是什么

python - LXML:获取标题/顶级注释

python - 使用 lxml 获取 HTML 的所有链接

xslt - 使用 xpath-default-namespace 定义在 XSL XPath 中使用的默认命名空间