使用 lxml 获取单个子笔记

Get a single child note using lxml

编辑 - 问题是我 运行 是 lxml 的过时版本 - 我现在觉得自己很愚蠢,但我很高兴我发现了。

我在遍历 XML 树以导出单个子元素时遇到问题。

我正在寻找的是隔离子元素并将它们导出到单独的 xml 文件中。但我的问题是,当我使用 'etree.iter' 函数时,我不仅获得了子元素,还获得了所有后续兄弟元素。怎么一次只能获取一个子元素?

这应该能更好地解释它。这是我的示例代码:

from lxml import etree

root = etree.XML("<users><user><name>Test</name><id>01</id></user> \
                         <user><name>Test</name><id>02</id></user> \
                         <user><name>Test</name><id>03</id></user></users>")

for record in root.iter("user"):
    print(etree.tostring(record))

它产生以下输出

b'<user><name>Test</name><id>01</id></user><user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>'
b'<user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>'
b'<user><name>Test</name><id>03</id></user></users>'

但我需要的是

b'<user><name>Test</name><id>01</id></user>'
b'<user><name>Test</name><id>02</id></user>'
b'<user><name>Test</name><id>03</id></user>'

我做错了什么?

不太确定为什么 iter 会产生这样的错误。试试这个,它工作正常。

xn = etree.fromstring("<users><user><name>Test</name><id>01</id></user><user><name>Test</name><id>02</id></user><user><name>Test</name><id>03</id></user></users>")
user_nodes = xn.findall("user")
str_nodes = [etree.tostring(un) for un in user_nodes]
print(str_nodes)

产生预期的输出

[
b'<user><name>Test</name><id>01</id></user>', 
b'<user><name>Test</name><id>02</id></user>', 
b'<user><name>Test</name><id>03</id></user>']