繁体   English   中英

LXML 命名空间前缀

[英]LXML namespace prefix

为什么以下“正常” XPath 不能使用 lxml 工作:

# Note: "Rows" is obviously not a real namespace, but for internal segmentation
xml_str = '''
<Data xmlns:R="Rows" xmlns:C="Columns" xmlns:V="Values">
    <R:ProductGroup value="Electronics">
    <R:Product value="Computer">
        <C:Year value="2018">
            <V:SumOfRevenue value="104"/>
            <V:SumOfUnits   value="3"/>
        </C:Year>
        <C:Year value="2019">
            <V:SumOfRevenue value="82"/>
            <V:SumOfUnits   value="9"/>
        </C:Year>
        <C:Year value="(all)">
            <V:SumOfRevenue value="186"/>
            <V:SumOfUnits   value="12"/>
            </C:Year>
        </R:Product>
    </R:ProductGroup>
</Data>
'''

from lxml import etree
node=etree.fromstring(xml_str)

//R:ProductGroup[@value="Electronics"]按照标准是有效的 XPath 并且可以在其他几个实用程序中使用,但似乎lxml有一种非常奇怪的命名空间寻址方式:

node.xpath('//R:ProductGroup[@value="Electronics"]', namespaces={'R':'Rows'})
[<Element {Rows}ProductGroup at 0x7f05836bec08>]

是否可以在不将其定义为 xpath 旁边的字典的情况下寻址命名空间?

它不一定比使用命名空间更优雅,但这会让你到达同一个地方:

node.xpath('//*[local-name()="ProductGroup"][@value="Electronics"]')

Output:

[<Element {Rows}ProductGroup at 0x1790b6fb240>]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM