2015-02-09 120 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