проблемы с разбором пространства имен XML.Показано ноль.в Python - PullRequest
0 голосов
/ 30 декабря 2018

Мой XML-файл доступен здесь .Хотя я могу получить корневой узел и его дочерние узлы из этого файла.Но я не могу получить тот, который мне нужен.Я хочу получить содержимое <ce:section-title>Methods</ce:section-title> Я пробовал оба пакета xml и lxml.

Когда я использую следующее,

 tree = lxml.etree.parse(fname) #fname is xml filename
 root= tree.getroot()

print(root[5].findall("ce:section-title",root.nsmap)

Это просто дает мне нулевую скобку [].Это дает ту же пустую скобку, когда я использую следующую команду:

for item in tree.iter('{http://www.elsevier.com/xml/ja/dtd}ce:section-title'):
    print(item)

Я попытался решить с предоставленным решением здесь , но я получаю следующую ошибку в этом коде:

ns = {"ce":"http://www.elsevier.com/xml/common/dtd"}
print(root.findall("ce:title", ns).text)

AttributeError: у объекта 'NoneType' нет атрибута 'text'

Любое направление будет полезным

1 Ответ

0 голосов
/ 31 декабря 2018

Должно работать с findall(.//ce:section-title, root.nsmap).

С добавленным .// вы ищете section-title потомков на всех уровнях ниже узла контекста.При findall(ce:section-title, root.nsmap) могут быть расположены только прямые дочерние элементы.

Пример:

from lxml import etree

tree = etree.parse("data.xml")  # Your XML
root = tree.getroot()

for e in root.findall(".//ce:section-title", root.nsmap):
    print(e.text)

Выход:

Abstract
Keywords
Introduction
Materials and methods
Results
The appearing species by taxon
List of regional appearing species
Discussion
Acknowledgments
References
...