2011-10-19 164 views
1

我想从xml文件中读取标签值,如<title>,<title_id><title>的值成功读取。是否可以用相同的循环读取<title><title_id>
请帮我我是新来的XML。阅读XML文件标签

 <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en"> 
     <siteinfo> 
     <sitename>Wiki</sitename> 
     <case>first-letter</case> 
     <namespaces> 
      <namespace key="0" case="first-letter" /> 
     </namespaces> 
     </siteinfo> 
     <page> 
     <title>Sex</title> 
     <title_id>31239628</title_id> 
     <revision> 
      <id>437708703</id> 
      <timestamp>2011-07-04T13:53:52Z</timestamp> 
      <text xml:space="preserve" bytes="6830">{{ Hello}} 

    </text> 
     </revision> 
     </page> 
    </mediawiki> 

我正在使用以下代码从文件中读取所有标题。它的工作正常。

import xml.etree.cElementTree as etree 
tree = etree.parse('find_title.xml') 
for value in tree.getiterator(tag='title'): 
    print value.text 

回答

1

如果您打算使用XML很多,我建议您熟悉XPATH

下面是一个使用我的XML首选项库lxml的快速片段。

from lxml import etree 

doc = etree.XML(""" 
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en"> 
    <siteinfo> 
    <sitename>Wiki</sitename> 
    <case>first-letter</case> 
    <namespaces> 
     <namespace key="0" case="first-letter" /> 
    </namespaces> 
    </siteinfo> 
    <page> 
    <title>Sex</title> 
    <title_id>31239628</title_id> 
    <revision> 
     <id>437708703</id> 
     <timestamp>2011-07-04T13:53:52Z</timestamp> 
     <text xml:space="preserve" bytes="6830">{{ Hello}} 
     </text> 
    </revision> 
    </page> 
</mediawiki> 
""") 

def first(seq,default=None): 
    for item in seq: 
    return item 
    return default 

NSMAP=dict(mw="http://www.mediawiki.org/xml/export-0.5/") 

print first(doc.xpath('/mw:mediawiki/mw:page/mw:title/text()',namespaces=NSMAP)) 
print first(doc.xpath('/mw:mediawiki/mw:page/mw:title_id/text()',namespaces=NSMAP)) 

收率:

 
Sex 
31239628 

更新 - 假设多个页面元素

XPath查询大多返回节点序列(因此first功能)。

您可以使用单个查询返回所有页面的两个标记的值。如果一个页面中缺少一个子元素,你将不得不将它们组合在一起。您可以编写查询以确保子元素存在,但您可能想知道有部分记录等等。

所以我的第一个答案是循环浏览页面,如下所示:

for i,page in enumerate(doc.xpath('/mw:mediawiki/mw:page',namespaces=NSMAP)): 
    title = first(page.xpath('./mw:title/text()',namespaces=NSMAP)) 
    title_id = first(page.xpath('./mw:title_id/text()',namespaces=NSMAP)) 
    print "Page %s: %s (%s)" % (i,title,title_id) 

产量:

Page 0: Sex (31239628)
+0

是的,这是一个有点矫枉过正。但是,当您遇到具有多个名称空间和重叠标记名称的文档时,知道如何使用名称空间是很好的。 – MattH

+0

感谢您的建议。它只显示一个结果。假设我有多个'' –