2015-02-09 118 views
0

我有一個dict映射每個xml標籤爲一個dict鍵。我想循環訪問xml中的每個標記和文本字段,並將其與另一個字典中的關鍵字dict鍵值進行比較。python lxml通過所有標籤循環

<2gMessage> 
    <Request> 
     <pid>daemon</pid> 
     <emf>123456</emf> 
     <SENum>2041788209</SENum> 
     <MM> 
      <MID>jbr1</MID> 
      <URL>http://jimsjumbojoint.com</URL> 
     </MM> 
     <AppID>reddit</AppID> 
     <CCS> 
      <Mode> 
       <SomeDate>true</CardPresent> 
       <Recurring>false</Recurring> 
      </Mode> 
      <Date> 
       <ASCII>B4788250000028291^RRR^15121015432112345601</ASCII> 
      </Date> 
      <Amount>100.00</Amount> 
     </CCS> 
    </Request> 
</2gMessage> 

的代碼,我到目前爲止有:

parser = etree.XMLParser(ns_clean=True, remove_blank_text=True) 
tree = etree.fromstring(strRequest, parser) 
for tag in tree.xpath('//Request'): 
    subfields = tag.getchildren() 
    for subfield in subfields: 
     print (subfield.tag, subfield.text) 
return strRequest 

但是,這只是打印這是請求的直接子標籤,我希望能夠獲得對兒童的subchildren如果它是一個實例在同一個循環中。我不想硬編碼值,因爲標籤和結構可能會改變。

+0

我嘗試運行你的代碼,但給錯誤。除此之外,'xml'也不好形成。 – Birei 2015-02-09 17:22:23

+1

你嘗試過[美麗的湯4](http://www.crummy.com/software/BeautifulSoup/)嗎?非常直觀的DOM導航。 _「Beautiful Soup位於流行的Python解析器之上,比如** lxml **和html5lib,允許您嘗試不同的解析策略或交易速度來獲得靈活性。」_ – 2015-02-09 17:34:35

回答

2

您可以試用iter()函數。它將遍歷所有的孩子元素。長度的比較,只有那些沒有孩子的打印:

一個完整的腳本像這樣的:

from lxml import etree 
tree = etree.parse('xmlfile') 
for tag in tree.iter(): 
    if not len(tag): 
     print (tag.tag, tag.text) 

產量:

pid daemon 
emf 123456 
SENum 2041788209 
MID jbr1 
URL http://jimsjumbojoint.com 
AppID reddit 
CardPresent true 
Recurring false 
ASCII B4788250000028291^RRR^15121015432112345601 
Amount 100.00 
+0

謝謝,正是我一直在尋找的! – roymustang86 2015-02-09 18:36:56