python lxml中的XQuery绝对路径

时间:2015-10-18 16:12:29

标签: python xml xpath xquery lxml

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

function select($data) {
$sql = "SELECT rozmer FROM zdroj_dat ORDER by id ASC";

if ($result = $conn->query($sql)) {
// fetch associative array
    while($row = $result->fetch_assoc()) {
    echo '<option value="'.$row[$data].'" >'.$row[$data].'</option>';       
    }
}
}

为了获得我目前使用的路径

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]

p现在具有值

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

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

更好的是包含索引的xquery路径。对于第一个c1节点,它看起来像这样:

/a1/b1/c1

或第二个c1节点

/a1/b1[1]/c1

任何人都知道如何实现这一目标? 是否有另一种方法来指定节点并在以后访问它?

1 个答案:

答案 0 :(得分: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]
  

是否有另一种方法来指定节点并在以后访问它?

如果你的意思是&#34;坚持不同的程序调用&#34;,那么不,不是真的。