我想从xml文件中读取<title>
, <title_id>
等标记值。"<title>
"的值读取成功。是否有可能读取<title>
, <title_id>
与相同的循环?
请帮帮我,我是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
如果您将经常使用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))
收益率:<>之前性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)