python - 使用 ElementTree getpath() 动态获取 Xpath

标签 python xpath lxml elementtree

我需要编写一个动态函数,通过动态构建元素的 XPath 在 ATOM xml 的子树上查找元素。

为此,我写了这样的东西:

    tree = etree.parse(xmlFileUrl)
    e = etree.XPathEvaluator(tree, namespaces={'def':'http://www.w3.org/2005/Atom'})
    entries = e('//def:entry')
    for entry in entries:
        mypath = tree.getpath(entry) + "/category"
        category = e(mypath)

上面的代码找不到“类别”,因为 getpath() 返回一个没有命名空间的 XPath,而 XPathEvaluator e() 需要命名空间。

虽然我知道我可以使用路径并在对 XPathEvaluator 的调用中提供命名空间,但我想知道是否可以使用所有命名空间使 getpath() 返回“完全限定”路径,因为这是在某些情况下很方便。

(这是我之前问题的衍生问题:Python XpathEvaluator without namespace)

最佳答案

基本上,使用标准的Python 的xml.etree 库,需要一个不同的访问函数。要实现此范围,您可以像这样构建 iter 方法的修改版本:

def etree_iter_path(node, tag=None, path='.'):
    if tag == "*":
        tag = None
    if tag is None or node.tag == tag:
        yield node, path
    for child in node:
        _child_path = '%s/%s' % (path, child.tag)
        for child, child_path in etree_iter_path(child, tag, path=_child_path):
            yield child, child_path

然后你可以使用这个函数从根节点开始迭代树:

from xml.etree import ElementTree

xmldoc = ElementTree.parse(*path to xml file*)
for elem, path in etree_iter_path(xmldoc.getroot()):
    print(elem, path)

关于python - 使用 ElementTree getpath() 动态获取 Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13136334/

相关文章:

java - xPath 在使用 for-each 循环变量时找不到选择器,但在其他情况下有效

python - etree.findall : 'OR' -lookup?

python - 使用 python 和 lxml 模块从 html 中删除所有 javascript 标签和样式标签

python - 在 GridSearchCV 的 roc_auc 分数中手动重现 Sklearn SVC

python - 多索引数据框的 lexsort_depth 到底是什么?

python - 来自 sys.getrefcount 的意外值

具有嵌套元素的 Python LXML 迭代解析

javascript - 想要创建一个新的应用程序用于网站流量监控(分析)

xml - 用于解析URL末尾的19位字符串的xpath表达式是什么?

php - 为什么 PHPs preg_match 在字符串上的工作方式与 string_literals 不同,用于将数据提取到命名数组中?