Поиск и преобразование инструкций обработки XML с использованием Python

Мы конвертируем наши древние документы FrameMaker в XML. Моя работа заключается в преобразовании этого:

<?FM MARKER [Index] foo, bar ?>` 

к этому:

<indexterm>
    <primary>foo, bar</primary>
</indexterm>

Я не беспокоюсь об этой части (пока); что озадачивает меня то, что ProcessingInstructionОни находятся во всех документах и ​​потенциально могут находиться под любым элементом, поэтому мне нужно иметь возможность искать по всему дереву, находить их и затем обрабатывать. Я не могу понять, как перебрать все дерево XML, используя minidom, Я пропускаю какой-то секретный метод / итератор? Это то, что я посмотрел до сих пор:

  • Elementtree имеет отличный Element.iter() метод, который представляет собой поиск в глубину, но не обрабатывает ProcessingInstructions.

  • ProcessingInstructionУ них нет имен тегов, поэтому я не могу искать их, используя minidom"s getElementsByTagName,

  • xml.sax"s ContentHandler.processingInstruction похоже, он используется только для создания ProcessingInstructions.

Если не считать моего собственного алгоритма поиска в глубину, есть ли способ создать список ProcessingInstructions в файле 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.

Рекомендации

Другие вопросы по тегам