Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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 使用lxml etree直接访问元素和属性_Python_Parsing_Lxml - Fatal编程技术网

Python 使用lxml etree直接访问元素和属性

Python 使用lxml etree直接访问元素和属性,python,parsing,lxml,Python,Parsing,Lxml,给定以下xml结构: <root> <a> <from name="abc"> <b>xxx</b> <c>yyy</c> </from> <to name="def"> <b>blah blah</b> <c

给定以下xml结构:

<root>
    <a>
        <from name="abc">
            <b>xxx</b>
            <c>yyy</c>
        </from>
        <to name="def">
            <b>blah blah</b>
            <c>another blah blah</c>
        </to>
    </a>
</root>

xxx
yyy
废话
又是废话
如何直接访问每个“a”的“from.b”值而不首先加载每个“a”的“from”(使用find())呢

正如您所看到的,“from”和“to”下有完全相同的元素。因此findall()方法不起作用,因为我必须区分“b”的值来自何处

我希望获得直接访问的方法,因为如果我必须加载每个子元素(有很多),我的代码将非常冗长。此外,在我的例子中,性能很重要,我有很多XML文档要解析!因此,我必须找到最快的方法来浏览文档(并将数据存储到数据库中)

在每个“a”元素中,正好有一个“from”元素,在每个“from”元素中,正好有一个“b”元素

使用lxml objectify可以做到这一点,但我想使用etree,因为首先我必须使用etree解析XML文档,因为我必须首先根据XSD文档验证XML模式,并且我不想再次重新解析整个文档

find
(和
findall
)也允许您指定元素的路径,例如,您可以执行以下操作:

root = ET.fromstring(input_xml)

for a in root.findall('a'):
    print(a, a.find('from/b').text)
假设您始终只有一个
from
b
元素

否则,我可能会尝试使用
findall
,并在Python代码中进行检查,如果这是为了更加健壮而设计的
find
(并且
findall
)也允许您指定元素的路径,例如,您可以执行以下操作:

root = ET.fromstring(input_xml)

for a in root.findall('a'):
    print(a, a.find('from/b').text)
假设您始终只有一个
from
b
元素

否则,我可能会尝试使用
findall
,并在Python代码中进行检查,如果这是为了更健壮的
root。findall('a/from/b')
也会在
a
根中使用
祖先查找所有
“b”
a
parent中的祖先