2013-03-12 3 views
1

Я относительный newby для Python и SO. У меня есть xml-файл, из которого мне нужно извлечь информацию. Я боролся с этим в течение нескольких дней, но я думаю, что, наконец, нашел то, что будет правильно извлекать информацию. Теперь у меня возникли проблемы с получением нужного результата. Вот мой код: «5e1882d882ec530069d6d29e28944396 Это параграф о акула»Анализ XML-файла из файла с использованием etree работает при чтении строки, но не в файле

from xml import etree 
node = etree.fromstring('<dataObject><identifier>5e1882d882ec530069d6d29e28944396</identifier><description>This is a paragraph about a shark.</description></dataObject>') 
identifier = node.findtext('identifier') 
description = node.findtext('description') 
print identifier, description 

Результат, который я получаю, что это то, что я хочу.

Однако мне действительно нужно иметь возможность читать из файла вместо строки. Поэтому я пробую этот код:

from xml import etree 
node = etree.parse('test3.xml') 
identifier = node.findtext('identifier') 
description = node.findtext('description') 
print identifier, description 

Теперь мой результат: «None None». У меня такое чувство, что я либо не получаю файл правильно, либо что-то не так с выходом. Вот содержание test3.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<response xmlns="http://www.eol.org/transfer/content/0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dwc="http://rs.tdwg.org/dwc/dwcore/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:dwct="http://rs.tdwg.org/dwc/terms/" xsi:schemaLocation="http://www.eol.org/transfer/content/0.3 http://services.eol.org/schema/content_0_3.xsd"> 
    <identifier>5e1882d822ec530069d6d29e28944369</identifier> 
    <description>This is a paragraph about a shark.</description> 

ответ

1

Ваш файл XML использует пространство имен по умолчанию. Вы должны квалифицироваться поиск с помощью правильного пространства имен:

identifier = node.findtext('{http://www.eol.org/transfer/content/0.3}identifier') 

для ElementTree, чтобы соответствовать правильные элементы.

Вы также можете указать .find(), findall() и iterfind() методы явного словаря пространства имен. . Это не очень хорошо документировано:

namespaces = {'eol': 'http://www.eol.org/transfer/content/0.3'} # add more as needed 

root.findall('eol:identifier', namespaces=namespaces) 

префиксы только ищется в параметре namespaces вы передаете в Это означает, что вы можете использовать любой префикс пространства имен вам нравится; API отделяет часть eol:, ищет соответствующий URL-адрес пространства имен в словаре namespaces, а затем меняет поиск, чтобы искать выражение XPath {http://www.eol.org/transfer/content/0.3}identifier.

Если вы хотите переключиться на lxml library, все будет лучше; эта библиотека поддерживает один и тот же ElementTree API, но собирает пространства имен для вас в атрибуте для элементов.

0

Задумывались ли вы пытаетесь BeautifulSoup разобрать ваш XML с питоном:

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#Parsing%20XML

Существует некоторая хорошая документация и здоровая онлайн группа поэтому поддержка неплох

+0

I на самом деле не думал об этом. Я попробую. – user2161557