【问题标题】:XQuery absolute path in python lxmlpython lxml中的XQuery绝对路径
【发布时间】:2015-10-18 16:12:28
【问题描述】:

我有一个 XML 文档,我想从中提取特定节点 (mynode) 的绝对路径以供以后使用。我这样检索节点:

from StringIO import StringIO
from lxml import etree

xml = """
<a1>
    <b1>
        <c1>content1</c1>
    </b1>
    <b1>
        <c1>content2</c1>
    </b1>
</a1>"""
root = etree.fromstring(xml)

i = 0
mynode = root.xpath('//c1')[i]

为了得到我当前使用的路径

ancestors = mynode.xpath('./ancestor::*')
p = ''.join( map( lambda x: '/' + x.tag , ancestors ) + [ '/' , mynode.tag ] )

p 现在有了值

/a1/b1/c1

但是,为了存储路径以供以后使用,我还必须存储第一个代码 sn-p 中的索引 i,以便检索正确的节点,因为对 p 的 xpath 查询将包含两个节点 c1。我不想存储那个索引。

最好是包含索引的 xquery 路径。对于第一个 c1 节点,它可能如下所示:

/a1/b1[1]/c1

或者这个用于第二个 c1 节点

/a1/b1[2]/c1

有人知道如何实现这一点吗? 是否有另一种方法来指定节点并稍后访问它?

【问题讨论】:

    标签: python xml xpath xquery lxml


    【解决方案1】:
    from lxml import etree
    from io import StringIO, BytesIO
    
    # ----------------------------------------------
    
    def node_location(node):
        position = len(node.xpath('./preceding-sibling::' + node.tag)) + 1
        return '/' + node.tag + '[' + str(position) + ']'
    
    def node_path(node):
        nodes = mynode.xpath('./ancestor-or-self::*')
        return ''.join( map(node_location, nodes) )
    
    # ----------------------------------------------
    
    xml = """
    <a1>
        <b1>
            <c1>content1</c1>
        </b1>
        <b1>
            <c1>content2</c1>
        </b1>
    </a1>"""
    
    root = etree.fromstring(xml)
    
    for mynode in root.xpath('//c1'):
        print node_path(mynode)
    

    打印

    /a1[1]/b1[1]/c1[1] /a1[1]/b1[2]/c1[1]

    还有其他方法可以指定节点并稍后访问它吗?

    如果您的意思是“在程序的单独调用中持续存在”,那么不,不是。

    【讨论】:

    • “在程序的单独调用中持续存在”就是我的意思。非常感谢您的努力
    • 如果使用了命名空间,可以在使用 this 之类的函数之前删除它们,或者相应地更改代码,因为 tag 属性返回 {mynamespace}mytag 并且为了通过 xquery one 访问节点必须用冒号分隔命名空间和标签,例如 {mynamespace}:mytag
    • 没错,需要考虑命名空间。但是,完全不建议删除命名空间。无论如何,让上面的代码感知命名空间只是一个很小的改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2011-06-15
    • 2011-02-05
    相关资源
    最近更新 更多