当前位置:  开发笔记 > 编程语言 > 正文

ElementTree XPath - 根据属性选择元素

如何解决《ElementTreeXPath-根据属性选择元素》经验,为你挑选了2个好方法。

我在ElementTree中使用属性XPath Selector时遇到问题,我应该可以根据文档来做

这是一些示例代码

XML


 
    
    
 
 
    
    
 

蟒蛇

def parse(document):
    root = et.parse(document)
    for target in root.findall("//target[@name='a']"):
        print target._children

我收到以下例外:

expected path separator ([)

Florian Bösc.. 34

您尝试使用的语法是ElementTree 1.3中的新增功能.

此版本随Python 2.7或更高版本一起提供.如果您使用的是Python 2.6或更低版本,那么您仍然可以使用ElementTree 1.2.6或更低版本.



1> Florian Bösc..:

您尝试使用的语法是ElementTree 1.3中的新增功能.

此版本随Python 2.7或更高版本一起提供.如果您使用的是Python 2.6或更低版本,那么您仍然可以使用ElementTree 1.2.6或更低版本.



2> Albert..:

这段代码有几个问题.

    Python的buildin ElementTree(简称ET)没有真正的XPATH支持; 只有有限的子集例如,它不支持像root这样的find-from-root表达式//target.

    注意:文档 提到了" // ",但仅针对儿童:所以表达式 .//target是有效的; //...不是!

    还有一种替代实现:lxml更丰富.对于内置代码,使用文档的接缝.那不符合/工作.

    @name符号选择XML- 属性 ; key=valuexml-tag中的表达式.

    因此,名称值必须为1或2才能选择给定文档中的内容.或者,可以使用子元素 "a"搜索目标:( target[a]不是@).

对于给定的文档,使用内置的ElementTree(v1.3)解析为root,以下代码是正确的并且正常工作:

root.findall(".//target") 找到两个目标

root.findall(".//target/a") 找到两个a元素

root.findall(".//target[a]") 这会再次找到两个target-element,因为它们都有一个a元素

root.findall(".//target[@name='1']")只找到第一个目标.请注意,需要大约1的引号; 否则会引发SyntaxError

root.findall(".//target[a][@name='1']")也有效; 找到那个目标

root.findall(".//target[@name='1']/a")只找到一个a元素; ...

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有