Ответ 1
ваш authortext
имеет тип 1 (ELEMENT_NODE
), обычно вам нужно иметь TEXT_NODE
, чтобы получить строку. Это будет работать
a.childNodes[0].nodeValue
У меня есть структура 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
Любые предложения по решению этой проблемы?
ваш authortext
имеет тип 1 (ELEMENT_NODE
), обычно вам нужно иметь TEXT_NODE
, чтобы получить строку. Это будет работать
a.childNodes[0].nodeValue
Элементные узлы не имеют 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).
Быстрый доступ:
node.getElementsByTagName('author')[0].childNodes[0].nodeValue
Я немного поиграл с ним, и вот что мне нужно:
# ...
authortext= a.childNodes[0].nodeValue
print authortext
приводящий к выходу:
C:\temp\py>xml2.py 1 Bob Nigel 2 Alice Mary
Я не могу точно сказать, почему вам нужно получить доступ к childNode, чтобы получить внутренний текст, но, по крайней мере, то, что вы искали.
Поскольку у вас всегда есть одно значение текстовых данных для автора, вы можете использовать element.firstChild.datap >
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