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

提案していただきありがとうございます。 1つの結果しか表示されません。私が複数の '' –