Python中如何使用lxml获取下面的元素?
How to use lxml in Python to get the following elements?
我有下一个 XML 文件:
<separator colspan="4" string="Application"/>
<field name="sel_groups_9_28_10" modifiers="{}"/>
<newline/>
<field name="sel_groups_49_50" modifiers="{}"/>
<newline/>
<field name="sel_groups_68" modifiers="{}"/>
<newline/>
<field name="sel_groups_36_37" modifiers="{}"/>
<newline/>
<field name="sel_groups_21_22_23" modifiers="{}"/>
<newline/>
<field name="sel_groups_43_44" modifiers="{}"/>
<newline/>
<field name="sel_groups_5_57_58" modifiers="{}"/>
<newline/>
<field name="sel_groups_59_60" modifiers="{}"/>
<newline/>
<field name="sel_groups_61_62" modifiers="{}"/>
<newline/>
<field name="sel_groups_19" modifiers="{}"/>
<newline/>
<field name="sel_groups_3_4" modifiers="{}"/>
<newline/>
<separator colspan="4" string="MY GROUP"/>
<field name="in_group_144" modifiers="{}"/>
<field name="in_group_142" modifiers="{}"/>
<field name="in_group_148" modifiers="{}"/>
<field name="in_group_147" modifiers="{}"/>
<field name="in_group_146" modifiers="{}"/>
<field name="in_group_145" modifiers="{}"/>
<field name="in_group_141" modifiers="{}"/>
<field name="in_group_143" modifiers="{}"/>
<separator colspan="4" string="Technical configuration"/>
<field name="in_group_30" modifiers="{}"/>
<field name="in_group_46" modifiers="{}"/>
<field name="in_group_12" modifiers="{}"/>
<field name="in_group_45" modifiers="{}"/>
<field name="in_group_33" modifiers="{}"/>
<field name="in_group_66" modifiers="{}"/>
<field name="in_group_25" modifiers="{}"/>
<field name="in_group_32" modifiers="{}"/>
树的常见结构为:
<separator 1/>
<field 1/>
<field 2/>
<field N/>
<separator 2/>
<field 1/>
<field 2/>
<field N/>
<separator N/>
<field 1/>
<field 2/>
<field N/>
我想要的是获取字符串与 MY GROUP 不同的分隔符以及从以下所有字段直到下一个分隔符(我的目的是使每个元素不可见,除了对于分隔符 MY GROUP 和字段 in_group_144, in_group_142, in_group_148, in_group_147, in_group_146, in_group_145, in_group_141 和 in_group_143).
XML 树将改变其字段名称,因此通过名称获取字段不是解决方案。
这里lxml/Python : get previous-sibling给出了如何获取前一个sibling,但是我怎样才能高效地获取tag为separator的前一个sibling?
我目前的解决方案:
def get_previous_separator(self, element):
previous_element = element.getprevious()
if previous_element.tag == 'separator':
return previous_element
else:
return get_previous_separator(element)
for element in tree:
if self.get_previous_separator(element).string != 'MY GROUP':
MAKE ELEMENT INVISIBLE
有没有比递归方法更直接的方法来管理我的目标?
您可以使用简单的 XPath 从当前 element
获取最近的前同级 separator
元素:
element.xpath('preceding-sibling::separator[1]')
我有下一个 XML 文件:
<separator colspan="4" string="Application"/>
<field name="sel_groups_9_28_10" modifiers="{}"/>
<newline/>
<field name="sel_groups_49_50" modifiers="{}"/>
<newline/>
<field name="sel_groups_68" modifiers="{}"/>
<newline/>
<field name="sel_groups_36_37" modifiers="{}"/>
<newline/>
<field name="sel_groups_21_22_23" modifiers="{}"/>
<newline/>
<field name="sel_groups_43_44" modifiers="{}"/>
<newline/>
<field name="sel_groups_5_57_58" modifiers="{}"/>
<newline/>
<field name="sel_groups_59_60" modifiers="{}"/>
<newline/>
<field name="sel_groups_61_62" modifiers="{}"/>
<newline/>
<field name="sel_groups_19" modifiers="{}"/>
<newline/>
<field name="sel_groups_3_4" modifiers="{}"/>
<newline/>
<separator colspan="4" string="MY GROUP"/>
<field name="in_group_144" modifiers="{}"/>
<field name="in_group_142" modifiers="{}"/>
<field name="in_group_148" modifiers="{}"/>
<field name="in_group_147" modifiers="{}"/>
<field name="in_group_146" modifiers="{}"/>
<field name="in_group_145" modifiers="{}"/>
<field name="in_group_141" modifiers="{}"/>
<field name="in_group_143" modifiers="{}"/>
<separator colspan="4" string="Technical configuration"/>
<field name="in_group_30" modifiers="{}"/>
<field name="in_group_46" modifiers="{}"/>
<field name="in_group_12" modifiers="{}"/>
<field name="in_group_45" modifiers="{}"/>
<field name="in_group_33" modifiers="{}"/>
<field name="in_group_66" modifiers="{}"/>
<field name="in_group_25" modifiers="{}"/>
<field name="in_group_32" modifiers="{}"/>
树的常见结构为:
<separator 1/>
<field 1/>
<field 2/>
<field N/>
<separator 2/>
<field 1/>
<field 2/>
<field N/>
<separator N/>
<field 1/>
<field 2/>
<field N/>
我想要的是获取字符串与 MY GROUP 不同的分隔符以及从以下所有字段直到下一个分隔符(我的目的是使每个元素不可见,除了对于分隔符 MY GROUP 和字段 in_group_144, in_group_142, in_group_148, in_group_147, in_group_146, in_group_145, in_group_141 和 in_group_143).
XML 树将改变其字段名称,因此通过名称获取字段不是解决方案。
这里lxml/Python : get previous-sibling给出了如何获取前一个sibling,但是我怎样才能高效地获取tag为separator的前一个sibling?
我目前的解决方案:
def get_previous_separator(self, element):
previous_element = element.getprevious()
if previous_element.tag == 'separator':
return previous_element
else:
return get_previous_separator(element)
for element in tree:
if self.get_previous_separator(element).string != 'MY GROUP':
MAKE ELEMENT INVISIBLE
有没有比递归方法更直接的方法来管理我的目标?
您可以使用简单的 XPath 从当前 element
获取最近的前同级 separator
元素:
element.xpath('preceding-sibling::separator[1]')