我有一个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
任何人都知道如何实现这一目标? 是否有另一种方法来指定节点并在以后访问它?
答案 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;,那么不,不是真的。