2014-12-09 36 views
0

我試圖迭代「變體」的所有「值」標記,代碼不會跳轉到下一個「值」鍵,因爲xml具有另一個「值」鍵「第一個值KEY」使用lxml模塊分析xml文件時出現問題

<variant> 
    <name>PROGRAMS</name> 
    <value> <!-- Lets call it FIRST VALUE KEY --> 
    <value>PROG1</value> 
    <statistics> 
     <statistic name="Stats"> 
      <value>5</value> 
     </statistic> 
    </statistics> 
    </value> 
    <value> <!-- SECOND VALUE KEY --> 
    <value>PROG2</value> 
    ... 
    </value> 
</variant> 
<variant> 
    <name>OTHER</name> 
    ... 
</variant> 

這裏是我的Python代碼

for keys in root.iter('variant'): 
    for variant in keys: 
     if variant.text == 'PROGRAMS': 
      for value_tag in keys.iter('value'): 
       ParamValue = value_tag.find('value').text 
        if ParamValue == 'PROG2': 
         print "GOT IT!" 
        else: continue # <- this jumps to the "<value>PROG1</value>" tag 
            # but it should jump to the "SECOND VALUE KEY" 

在哪裏的問題?

+0

什麼是期望的輸出? – unutbu 2014-12-09 13:35:05

+0

可以說它必須在'if ifParamValue =='PROG2'之後打印一些東西:'condition – Pythonizer 2014-12-09 13:36:03

回答

1
import lxml.etree as ET 
root = ET.parse('data').getroot() 

for value in root.xpath(
    '''//variant 
      [name 
      [text()="PROGRAMS"]] 
     /value 
      [value 
      [text()="PROG2"]]'''): 
    print('GOT IT') 

產生

GOT IT 

我認爲這是比較容易use XPath向下挖掘到你想要的元素。 中的XPath意味着

//       # look for all elements 
variant     # that are variants 
    [name     # that have a <name> element 
    [text()="PROGRAMS"]] # with text equal to "PROGRAMS" 
/value     # select the <value> (child of variant) 
    [value     # that has a child <value> element 
    [text()="PROG2"]]  # with text equal to "PROG2" 

遍歷<statistics>兒童<value>元素:

for statistics in root.xpath(
    '''//variant 
      [name 
      [text()="PROGRAMS"]] 
     /value 
      [value 
      [text()="PROG2"]] 
      /statistics'''): 

在XPath,括號[..]鬆散翻譯成 「這樣」。請注意,如果沒有括號,上面的XPath將是//variant/value/statistics。它看起來有點像文件路徑。和文件路徑一樣,它顯示了元素的譜系。一個/意味着「直接子女」,而//意味着「子孫後代」(例如兒童,孫子或孫子女等)。

+0

這樣一種到達目的地的簡單方法:o但是還有一個問題,如何開始迭代PROG2下的「統計」鍵 – Pythonizer 2014-12-09 14:21:47