Поиск и преобразование инструкций обработки XML с использованием Python
Мы конвертируем наши древние документы FrameMaker в XML. Моя работа заключается в преобразовании этого:
<?FM MARKER [Index] foo, bar ?>`
к этому:
<indexterm>
<primary>foo, bar</primary>
</indexterm>
Я не беспокоюсь об этой части (пока); что озадачивает меня то, что ProcessingInstruction
Они находятся во всех документах и потенциально могут находиться под любым элементом, поэтому мне нужно иметь возможность искать по всему дереву, находить их и затем обрабатывать. Я не могу понять, как перебрать все дерево XML, используя minidom
, Я пропускаю какой-то секретный метод / итератор? Это то, что я посмотрел до сих пор:
Elementtree
имеет отличныйElement.iter()
метод, который представляет собой поиск в глубину, но не обрабатываетProcessingInstruction
s.ProcessingInstruction
У них нет имен тегов, поэтому я не могу искать их, используяminidom
"sgetElementsByTagName
,xml.sax
"sContentHandler.processingInstruction
похоже, он используется только для созданияProcessingInstruction
s.
Если не считать моего собственного алгоритма поиска в глубину, есть ли способ создать список ProcessingInstruction
s в файле XML или идентифицировать своих родителей?
1 ответ
Используйте XPath API lxml
модуль как таковой:
from lxml import etree
foo = StringIO('<foo><bar></bar></foo>')
tree = etree.parse(foo)
result = tree.xpath('//processing-instruction()')
Тестовая инструкция обработки узла () верна для любой инструкции обработки. Тест processing-инструкция () может иметь аргумент Literal; в этом случае это верно для любой инструкции обработки, имя которой равно значению Literal.
Рекомендации