Дополнительно
Модуль Python ElementTree: как игнорировать пространства имен XML-файлов, чтобы найти соответствующий элемент при использовании метода на "обнаружить", "в метод findAll и"
Я хочу использовать метод "в метод findAll", чтобы найти некоторые элементы из исходного XML-файла в модуле ElementTree.
Однако XML-файл источник (test.xml) имеет пространства имен. Я усечь часть XML-файл в качестве образца:
<?xml version="1.0" encoding="iso-8859-1"?>
<XML_HEADER xmlns="http://www.test.com">
<TYPE>Updates</TYPE>
<DATE>9/26/2012 10:30:34 AM</DATE>
<COPYRIGHT_NOTICE>All Rights Reserved.</COPYRIGHT_NOTICE>
<LICENSE>newlicense.htm</LICENSE>
<DEAL_LEVEL>
<PAID_OFF>N</PAID_OFF>
</DEAL_LEVEL>
</XML_HEADER>
Образец кода ниже:
from xml.etree import ElementTree as ET
tree = ET.parse(r"test.xml")
el1 = tree.findall("DEAL_LEVEL/PAID_OFF") # Return None
el2 = tree.findall("{http://www.test.com}DEAL_LEVEL/{http://www.test.com}PAID_OFF") # Return <Element '{http://www.test.com}DEAL_LEVEL/PAID_OFF' at 0xb78b90>
Хотя это может работать, потому что есть пространство имен " и{http://www.test.com}", Он's очень неудобно, чтобы добавить пространства имен перед каждым тегом.
Как я могу игнорировать пространства имен при использовании метода на "обнаружить", "в метод findAll" и так далее?
118
9
Вместо изменения самого XML-документа, он'ы лучше разобрать его и измените теги в результате. Таким образом, вы можете обрабатывать несколько имен и псевдонимов пространств имен:
Это основано на обсуждении здесь: http://bugs.python.org/issue18304
Если убрать xmlns атрибут из XML до разбора, то есть выиграл'т быть пространство имен префикс для каждого тега в дереве.
Ответы до сих пор явно поставил значение пространства имен в сценарии. Для более общее решение, я бы скорее извлечь пространства имен из XML:
И использовать его в метод find:
Здесь'ы расширение девятиугольника'ы ответ, который также полоски от имен атрибутов:
Улучшая ответ на ericspod:
Вместо того, чтобы изменить режим парсинга в мире мы можем обернуть это в объект обслуживания с конструкции.
Это может быть использовано следующим образом
Красота этого способа заключается в том, что он не вносит никаких изменений в поведении для несвязанных код вне блока. Я в конечном итоге создание этого после получения ошибки в несвязанных библиотеки после использования версии ericspod которой также довелось пользоваться эмигранта.
Вы можете использовать элегантный форматирование строки строительства, а также:
или, если вы're уверен, что PAID_OFF появляется только в одном уровне в дереве:
Если вы'вновь с помощью ElementTree
, а не
главноевы можете заставить эмигранта игнорировать обработку пространства имен, заменив
ParserCreate()`:ElementTree
пытается использовать эмигрант по призваниюParserCreate ()
, но не дает возможность не предоставляет разделитель пространства имен строки, приведенный выше код вызовет его игнорировать, но быть предупрежденным, это может сломать другие вещи.Позвольте'ы комбината девятиугольника'ы ответ с mzjn'ы ответ на соответствующий вопрос:
С помощью этой функции мы:
Создать итератор, чтобы получить оба пространства имен и разобранный объект Дерево.
Перебрать созданный итератор, чтобы получить пространство имен дикт, что мы можем впоследствии, проходят в каждом найти () " или " метод findAll звоните ()` как предложено по iMom0.
Возвращение дерева'ы корневого элемента объекта и пространства имен.
Я думаю, что это лучший подход, все вокруг, как там's нет манипуляций или из источника XML или в результате проанализированного
в формате XML.etree.Выход ElementTree
не участвовала.Я'd, как и кредит Барни'ы ответ с предоставлением важной частью этой головоломки (которые вы можете получить разобранный корень из итератора). Пока что я на самом деле проходится дважды XML-дерево в мое приложение (один раз, чтобы получить пространство имен, второй на корень).
Я может быть поздно, но я не думаю, что `повторно.суб-хорошее решение.
Однако переписать в XML.парсеров.экспат` не работает для Python 3.X версий,
Главным виновником является xml/etree/ElementTree.py` смотрите внизу исходный код
И это довольно печально.
Решение избавиться от него первым.
Проверена на Python 3.6.
Попробовать "попробовать" инструкция полезна в случае, если где-то в коде вы перезагрузить или импортировать модуль в два раза, вы получаете некоторые странные ошибки, такие как
кстати блин исходный код etree выглядит очень неаккуратно.