Python 3.4、etree.iterparse を使用して GB++ サイズの XML ウィキペディア ダンプ ファイルを解析します。後者の値に応じて、現在一致する<page>
要素内でその値をテストしたいと思います。次に、オブジェクト全体のソース XML と、その中にネストされた要素を含むすべてのコンテンツ、つまり記事全体の XML をエクスポートします。<ns>
<page>
オブジェクトを反復して<page>
必要なものを見つけることができますが、使用可能なすべての関数がテキスト/属性値を読み取りたいように見えますが、ソースファイルの XML コードの utf8 文字列コピーがスコープ内の完全な<page>
オブジェクトに必要なだけです。これは可能ですか?
XML の簡略版は次のようになります。
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xml:lang="en">
<page>
<title>Some Article</title>
<ns>0</ns>
<revision>
<timestamp>2017-07-27T00:59:41Z</timestamp>
<text xml:space="preserve">some text</text>
</revision>
</page>
<page>
<title>User:Wonychifans</title>
<ns>2</ns>
<revision>
<text xml:space="preserve">blah blah</text>
</revision>
</page>
</mediawiki>
<ns>
値テストを実行するための Python コードは次のとおりです。
``from lxml import etree
# store namespace string for all elements (only one used in Wikipedia XML docs)
NAMESPACE = '{http://www.mediawiki.org/xml/export-0.10/}'
ns = {'wiki' : 'http://www.mediawiki.org/xml/export-0.10/'}
context = etree.iterparse('src.xml', events=('end',))
for event, elem in context:
# at end of parsing each
if elem.tag == (NAMESPACE+'page') and event == 'end':
tagNs = elem.find('wiki:ns',ns)
if tagNs is not None:
nsValue = tagNs.text
if nsValue == '2':
# export the current <page>'s XML code
この場合、2 番目の要素、つまり以下を保持する文字列のみの XML コードを抽出したいと思います。<page>
<page>
<title>User:Wonychifans</title>
<ns>2</ns>
<revision>
<text xml:space="preserve">blah blah</text>
</revision>
</page>
編集:マイナーなタイプミスとより良いマークアップ