2011-10-19 198 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

感謝您的建議。它只顯示一個結果。假設我有多個'' –