2015-11-23 99 views
2

我的下一個XML文件:如何在Python中使用lxml以獲取以下元素?

<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和字段in_group_144,in_group_142in_group_148in_group_147in_group_146in_group_145in_group_141in_group_143)。

XML樹會改變它的字段名稱,所以通過它們的名字獲取字段將不是一個解決方案。

這裏lxml/Python : get previous-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 

有沒有什麼辦法,而不是管理我的目標遞歸方法更直接?

回答

0

您可以使用簡單的XPath擺脫當前element最近的前一個兄弟separator元素:

element.xpath('preceding-sibling::separator[1]') 
+0

謝謝@ har07,這個工程完美 – forvas

相關問題