Подтвердить что ты не робот

Чтение XML с использованием мини-микрофона Python и повторение каждого из node

У меня есть структура XML, которая выглядит следующим образом, но в гораздо большем масштабе:

<root>
    <conference name='1'>
        <author>
            Bob
        </author>
        <author>
            Nigel
        </author>
    </conference>
    <conference name='2'>
        <author>
            Alice
        </author>
        <author>
            Mary
        </author>
    </conference>
</root>

Для этого я использовал следующий код:

dom = parse(filepath)
conference=dom.getElementsByTagName('conference')
for node in conference:
    conf_name=node.getAttribute('name')
    print conf_name
    alist=node.getElementsByTagName('author')
    for a in alist:
        authortext= a.nodeValue
        print authortext

Однако распечатанное authortext является "Нет". Я попробовал возиться с использованием таких вариаций, как то, что ниже, но это заставляет мою программу сломаться.

authortext=a[0].nodeValue

Правильный вывод должен быть:

1
Bob
Nigel
2
Alice
Mary

Но я получаю:

1
None
None
2
None
None

Любые предложения по решению этой проблемы?

4b9b3361

Ответ 1

ваш authortext имеет тип 1 (ELEMENT_NODE), обычно вам нужно иметь TEXT_NODE, чтобы получить строку. Это будет работать

a.childNodes[0].nodeValue

Ответ 2

Элементные узлы не имеют nodeValue. Вы должны посмотреть на узлы Text внутри них. Если вы знаете, что внутри всего текста node вы можете сказать element.firstChild.data (данные такие же, как nodeValue для текстовых узлов).

Будьте осторожны: если текстового содержимого не будет, дочерние узлы Text и element.firstChild будут иметь значение null, что приведет к сбою доступа .data.

Быстрый способ получить содержимое прямых дочерних текстовых узлов:

text= ''.join(child.data for child in element.childNodes if child.nodeType==child.TEXT_NODE)

В DOM Level 3 Core вы получаете свойство textContent, которое вы можете использовать для рекурсивного вывода текста из элемента Element, но minidom не поддерживает это (некоторые другие реализации DOM Python).

Ответ 3

Быстрый доступ:

node.getElementsByTagName('author')[0].childNodes[0].nodeValue

Ответ 4

Я немного поиграл с ним, и вот что мне нужно:

# ...
authortext= a.childNodes[0].nodeValue
print authortext

приводящий к выходу:

C:\temp\py>xml2.py
1
Bob
Nigel
2
Alice
Mary

Я не могу точно сказать, почему вам нужно получить доступ к childNode, чтобы получить внутренний текст, но, по крайней мере, то, что вы искали.

Ответ 5

Поскольку у вас всегда есть одно значение текстовых данных для автора, вы можете использовать element.firstChild.data​​p >

dom = parseString(document)
conferences = dom.getElementsByTagName("conference")

# Each conference here is a node
for conference in conferences:
    conference_name = conference.getAttribute("name")
    print 
    print conference_name.upper() + " - "

    authors = conference.getElementsByTagName("author")
    for author in authors:
        print "  ", author.firstChild.data
    # for

    print