Как получить список строк из файла XML, используя xml.dom.minidom Python? - PullRequest
0 голосов
/ 31 марта 2012

Все -

Я пытаюсь проанализировать следующую, очень простую структуру документа 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 ... 

Я хотел бы перебрать структуру данных «слова» в этом коде. Я знаю, что доступны гораздо более мощные XML-модули ... но сейчас я бы хотел решить эту проблему с помощью показанного модуля.

Любая помощь с этим будет очень признательна.

Заранее спасибо и всего наилучшего -

Pat

Ответы [ 4 ]

1 голос
/ 31 марта 2012

Я предполагаю, что слова перечислены в узлах 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']
0 голосов
/ 31 марта 2012

Похоже, в вашем документе XML несколько word_X слов сгруппированы внутри элемента xml. Так как они не являются разными элементами XML, вы не можете делать такие запросы. Вместо этого вы можете использовать регулярное выражение для разбора строки одного элемента
Например: Предположим, у вас есть wordListAsSingleString, который содержит (если вы можете запросить это):

       word_1
       word_2

re.split('\s+', wordListAsSingleString) даст вам список слов.

0 голосов
/ 31 марта 2012

Если вы хотите, чтобы слова были строкой, добавьте .data в конец:

words = dom.getElementsByTagName( 'unigrams' )[0].childNodes[0].data
0 голосов
/ 31 марта 2012

Если вы не женаты на «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. Вы можете игнорировать.

...