2013-02-12 261 views
1

我有下面的XML:解析XML与LXML和Python

<nfl> 
    <season season="2012"/> 
    <conference label="AFC"> 
     <division label="Eastern Division"> 
     <team city="Buffalo" name="Bills" alias="Buf" /> 
     <team city="Miami" name="Dolphins" alias="Mia" /> 
     <team city="New England" name="Patriots" alias="NE" /> 
     <team city="New York" name="Jets" alias="NYJ" /> 
     </division> 
     <division label="Western Division"> 
     <team city="Denver" name="Broncos" alias="Den" /> 
     <team city="Kansas City" name="Chiefs" alias="KC" /> 
     <team city="Oakland" name="Raiders" alias="Oak" /> 
     <team city="San Diego" name="Chargers" alias="SD" /> 
     </division> 
     <division label="Northern Division"> 
     <team city="Cincinnati" name="Bengals" alias="Cin" /> 
     <team city="Cleveland" name="Browns" alias="Cle" /> 
     <team city="Pittsburgh" name="Steelers" alias="Pit" /> 
     <team city="Baltimore" name="Ravens" alias="Bal" /> 
     </division> 
     <division label="Southern Division"> 
     <team city="Houston" name="Texans" alias="Hou" /> 
     <team city="Tennessee" name="Titans" alias="Ten" /> 
     <team city="Indianapolis" name="Colts" alias="Ind" /> 
     <team city="Jacksonville" name="Jaguars" alias="Jac" /> 
    </division> 
    </conference> 
    <conference label="NFC"> 
    <division label="Eastern Division"> 
     <team city="Dallas" name="Cowboys" alias="Dal" /> 
     <team city="New York" name="Giants" alias="NYG" /> 
     <team city="Philadelphia" name="Eagles" alias="Phi" /> 
     <team city="Washington" name="Redskins" alias="Was" /> 
    </division> 
    <division label="Western Division"> 
     <team city="St. Louis" name="Rams" alias="StL" /> 
     <team city="Arizona" name="Cardinals" alias="Ari" /> 
     <team city="San Francisco" name="49ers" alias="SF" /> 
     <team city="Seattle" name="Seahawks" alias="Sea" /> 
    </division> 
    <division label="Northern Division"> 
     <team city="Chicago" name="Bears" alias="Chi" /> 
     <team city="Detroit" name="Lions" alias="Det" /> 
     <team city="Green Bay" name="Packers" alias="GB" /> 
     <team city="Minnesota" name="Vikings" alias="Min" /> 
    </division> 
    <division label="Southern Division"> 
     <team city="Atlanta" name="Falcons" alias="Atl" /> 
     <team city="New Orleans" name="Saints" alias="NO" /> 
     <team city="Tampa Bay" name="Buccaneers" alias="TB" /> 
     <team city="Carolina" name="Panthers" alias="Car" /> 
    </division> 
</conference> 

</nfl> 

我要加载到我的模型,团队“城市”,“名”和“别名”与父母一起“师标签“,”会议标签“和”季节“。

在Python中,我通过数据迭代如下:

from lxml import etree 
doc = etree.parse('thisxmlfile.xml') 
for s in doc.xpath('//season'): 
    for c in doc.xpath('//conference'): 
     for t in doc.xpath('//conference/division/team'): 
      print s.get('season'), c.get('label'), t.get('city'), t.get('name'), t.get('alias') 

但当然,它通过所有“团队”标签两次迭代 - 每进行一次“会议”标签。我想要做的就是遍历所有“团队”标签,并获得父母“分标签”,父母“会议标签”和父母“季节季节”。

肯定我需要引用XPath轴,并寻找一些帮助?

我在寻找的输出是:

2012 AFC Buffalo Bills Buf 
2012 AFC Miami Dolphins Mia 
2012 AFC New England Patriots NE 
. 
. 
. 
2012 NFC New Orleans Saints NO 
2012 NFC Tampa Bay Buccaneers TB 
2012 NFC Carolina Panthers Car 

注:上面的输出不包括“师标签”,但一旦我弄清楚如何获得“会议标签”,它应该是简单。

在此先感谢您的帮助。

回答

1

这里是你如何能得到想要的输出:

from lxml import etree 

doc = etree.parse('thisxmlfile.xml') 

# There is only one "season" element 
season = doc.find('season').get('season')  

# XPath query relative to root node 
for conference in doc.xpath('conference'): 
    # XPath query relative to "conference" node  
    for team in conference.xpath('division/team'):  
     print season, conference.get('label'), 
     print team.get('city'), team.get('name'), team.get('alias') 
+0

非常完美 - 非常感谢你! – user2063225 2013-02-13 15:14:07