gpt4 book ai didi

python - 使用 lxml etree 通过 xml 文件进行条件循环

转载 作者:行者123 更新时间:2023-12-01 06:06:59 26 4
gpt4 key购买 nike

我想知道是否可以在lxml库中将条件语句与tree.findall("...")语句连接起来?

我的文件中有以下 xml 结构

    <sss version="1.2">
<date>2011-09-23</date>
<time>12:32:29</time>
<origin>OPST</origin>
<user></user>
<survey>
<name>Test</name>
<version>2011-09-02 15:50:10</version>
<record ident="A">
<variable ident="10" type="quantity">
<name>no_v</name>
<label>Another question</label>
<position start="23" finish="24"/>
<values>
<range from="0" to="32"/>
</values>
</variable>
<variable ident="11" type="quantity">
<name>v_683</name>
<label>another totally another Question</label>
<position start="25" finish="26"/>
<values>
<range from="0" to="33"/>
</values>
</variable>
<variable ident="12" type="quantity">
<name>v_684</name>
<label>And once more Question</label>
<position start="27" finish="29"/>
<values>
<range from="0" to="122"/>
</values>
</variable>
<variable ident="20" type="single">
<name>v_684</name>
<label>Question with alternatives</label>
<position start="73" finish="73"/>
<values>
<range from="1" to="6"/>
<value code="1">Alternative 1</value>
<value code="2">Alternative 2</value>
<value code="3">Alternative 3</value>
<value code="6">Alternative 4</value>
</values>
</variable>
</record>
</survey>
</sss>

我现在想做的是仅获取 Survey/record/variable/name .text 和 Survey/record/variable/values/value .text(如果名称以“v_”开头)

到目前为止我已经有了第一部分

from lxml import etree as ET
tree = ET.parse('scheme.xml')
[elem.text for elem in tree.getiterator(tag='name') if elem.text.startswith('v_')]

但是我怎样才能获得相同元素的调查/记录/变量/值/值.文本...并像过滤器一样使用调查/记录/变量/名称.文本?非常感谢!

最佳答案

[(elem.text,elem.getparent().xpath('values/value/text()')) 
for elem in tree.getiterator(tag='name') if elem.text.startswith('v_')]

产量

[('v_683', []),
('v_684', []),
('v_684',
['Alternative 1', 'Alternative 2', 'Alternative 3', 'Alternative 4'])]

elemname元素。因此,要获取关联值,您可以首先找到其父级( variable ),然后搜索 values child ,然后是value子子元素。

<小时/>

删除 getparent 的替代方案调用,但使用稍微复杂一点的XPath是:

[(elem.text,elem.xpath('following-sibling::values/value/text()')) for elem in tree.getiterator(tag='name')  if elem.text.startswith('v_')]

following-sibling::告诉xpath生成 name 的所有 sibling .

following-sibling::values告诉xpath生成 name 的所有 sibling 那是values元素。

关于python - 使用 lxml etree 通过 xml 文件进行条件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545960/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com