Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可能获取用于评估xpath结果的所有上下文节点?_Python_Xpath_Lxml - Fatal编程技术网

Python 是否可能获取用于评估xpath结果的所有上下文节点?

Python 是否可能获取用于评估xpath结果的所有上下文节点?,python,xpath,lxml,Python,Xpath,Lxml,是否可能获取用于评估xpath结果的所有上下文节点? 在以下代码中: test_xml = """ <r> <a/> <a> <b/> </a> <a> <b/> </a> </r> """ test_root = lxml.etree.fromstring(test_xml) res = test_root.xpat

是否可能获取用于评估xpath结果的所有上下文节点? 在以下代码中:

test_xml = """
<r>
    <a/>
    <a>
        <b/>
    </a>
    <a>
        <b/>
    </a>
</r>
"""
test_root = lxml.etree.fromstring(test_xml)
res = test_root.xpath("//following-sibling::*[1]/b")
for node in res:
    print test_root.getroottree().getpath(node)
是否可以获取上述xpath计算中使用的所有上下文节点:

/r/a[1] /r/a[2] /r/a[2]/b
第二个结果是:

/r/a[2] /r/a[3]/b /r/a[3]/b
?? 当使用子轴时,我可以从工作中获得这些节点

element_tree.getpath(elem)
但是其他轴呢


TIA,关于

如果我正确理解了您的问题,您正在尝试获取特定节点的祖先节点。此函数的XPATH表达式为:

//particular-element/ancestor::*
例如:

/r/a[2]/b/ancestor::*

如果我正确理解了您的问题,那么您正在尝试获取特定节点的祖先节点。此函数的XPATH表达式为:

//particular-element/ancestor::*
例如:

/r/a[2]/b/ancestor::*

我反转了每个阶段的xpath,以获得在结果中计算哪些项:

for node in res:
    j = node.xpath('./parent::*')[0]
    k = j.xpath('./preceding-sibling::*[1]')[0]
    # You didn't specify these but they were used in the evaluation
    ancestors = k.xpath('./ancestor::*')
    for item in [node, j, k] + ancestors:
        print item.getroottree().getpath(item)
    print '\n\n'
给我:

/r/a[2]/b、/r/a[2]、/r/a[1]、/r


/r/a[3]/b、/r/a[3]、/r/a[2]、/r

我反转了每个阶段的xpath,以获得将在结果中评估哪些项:

for node in res:
    j = node.xpath('./parent::*')[0]
    k = j.xpath('./preceding-sibling::*[1]')[0]
    # You didn't specify these but they were used in the evaluation
    ancestors = k.xpath('./ancestor::*')
    for item in [node, j, k] + ancestors:
        print item.getroottree().getpath(item)
    print '\n\n'
给我:

/r/a[2]/b、/r/a[2]、/r/a[1]、/r


/r/a[3]/b、/r/a[3]、/r/a[2]、/r

我不明白“用于评估xpath结果”是什么意思。我的意思是在找到结果时,每级xpath查询的上下文节点的顺序(由axis表示)。对于//以下同级::*[1]/b我希望有三个节点:1。“根元素”,其中avaluation开始于2。元素如下同级::*[1]的“根元素”3。最后一个是确切的元素,它是查询的结果,所以本质上您试图获取特定xml元素的所有祖先节点?@user258541:您的问题存在一个概念性问题:启动
/
操作符将扩展为
/degenerat或self::node()/
。这意味着在文档根之后,整个树将是trasverse(并且每个节点都将是下一步的“上下文中”节点)。我不理解“用于评估xpath结果”的含义。我的意思是在找到结果时,每一级xpath查询的上下文节点的顺序(由axis表示)。对于//以下同级::*[1]/b我希望有三个节点:1。“根元素”,其中avaluation开始于2。元素如下同级::*[1]的“根元素”3。最后一个是确切的元素,它是查询的结果,所以本质上您试图获取特定xml元素的所有祖先节点?@user258541:您的问题存在一个概念性问题:启动
/
操作符将扩展为
/degenerat或self::node()/
。这意味着在文档根之后,整个树将是trasverse(每个节点都将是下一步的“上下文”节点)。