0

全て -

を使用して、次の非常に単純な XML ドキュメント構造を解析しようとしています。

from xml.dom.minidom import parse

XML は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
    <list>
       <file name="..." url="...">
       <words>
           word_1
           word_2
           ...

私が抱えている問題は、XML に、文字列のリストとしてアクセスしたい単語のリストが含まれていることです...そして、私はそれを正しく理解できないようです。これまでのところ、コードに関して私が持っているものは次のとおりです。

import sys
from xml.dom.minidom import parse

for file in sys.argv[1:]:

    dom = parse( file )

    title = dom.getElementsByTagName( 'job_ad' )[0].getAttribute( 'title' )
    # This works 

    words = dom.getElementsByTagName( 'unigrams' )[0].childNodes[0]

    # This is NOT a list of strings ... 

このコードのデータ構造「words」を繰り返し処理したいと思います。より強力な XML モジュールが利用できることは知っていますが、今のところ、ここに示すモジュールでこれを解決したいと思います。

これについての助けは大歓迎です。

よろしくお願いいたします -

パット

4

4 に答える 4

1

ノードの下に単語がwordsプレーンテキストとしてリストされていると仮定します。その場合、wordsノードからテキストを取得して分割するだけです。

s="""<?xml version="1.0" encoding="utf-8"?>
    <list>
       <file name="..." url="...">
       <words>
           word_1
           word_2
        </words>
       </file>
    </list>"""

import sys
from xml.dom.minidom import parseString

dom = parseString(s)
words_text = dom.getElementsByTagName('words')[0].firstChild.nodeValue
words = words_text.split()
print words

出力:

[u'word_1', u'word_2']
于 2012-03-30T20:55:23.060 に答える
0

「xml.dom.minidom」と結婚していない場合は、lxml (http://lxml.de/) をチェックアウトすることをお勧めします。

コードは次のようになります。

import lxml.etree
doc = lxml.etree.parse( open(file) )
words = doc.findtext('words')

WHOOPS -- 投稿者が「xml.dom.minidom」を使用して回答を具体的に要求したことがわかりました。申し訳ありませんが、lxml を使用しています。無視できます。

于 2012-03-30T20:35:07.373 に答える
0

あなたの XML ドキュメントでは、複数のword_X単語が xml 要素内にグループ化されているようです。それらは異なる XML 要素ではないため、そのように照会することはできません。代わりに、正規表現を使用して単一の要素文字列を解析できます
。例: which が含まれていると仮定しますwordListAsSingleString(それをクエリできる場合):

       word_1
       word_2

re.split('\s+', wordListAsSingleString)単語のリストを表示します。

于 2012-03-30T20:45:32.817 に答える
0

単語を文字列にしたい場合は、末尾に .data を追加します。

words = dom.getElementsByTagName( 'unigrams' )[0].childNodes[0].data
于 2012-03-30T20:53:12.720 に答える