我们正在将古老的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
列表,或者识别他们的父母?
答案 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值的处理指令都是如此。
<强>参考强>