使用Python查找和转换XML处理指令

时间:2015-05-20 20:53:44

标签: python xml elementtree minidom processing-instruction

我们正在将古老的FrameMaker文档转换为XML。我的工作是转换它:

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

到此:

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

我并不担心那部分(还);令我感到困惑的是,ProcessingInstruction遍布文档并且可能位于任何元素之下,因此我需要能够搜索整个树,找到它们,然后处理它们。我无法弄清楚如何使用minidom迭代整个XML树。我错过了一些秘密方法/迭代器吗?这是我到目前为止所看到的:

  • Elementtree具有优秀的Element.iter()方法,这是一种深度优先搜索,但它不会处理ProcessingInstruction

  • ProcessingInstruction没有标记名称,因此我无法使用minidom getElementsByTagName来搜索它们。

  • xml.sax&#39; ContentHandler.processingInstruction看起来只用于创建ProcessingInstruction

如果没有创建我自己的深度优先搜索算法,有没有办法在XML文件中生成ProcessingInstruction列表,或者识别他们的父母?

1 个答案:

答案 0 :(得分:2)

使用lxml模块的XPath API:

from lxml import etree

foo = StringIO('<foo><bar></bar></foo>')
tree = etree.parse(foo)
result = tree.xpath('//processing-instruction()')
  

对于任何处理指令,节点测试processing-instruction()都为true。 processing-instruction()测试可能有一个Literal参数;在这种情况下,对于任何名称等于Literal值的处理指令都是如此。

<强>参考