我们正在将古老的FrameMaker文档转换为XML。我的工作是转换这个:
<?FM MARKER [Index] foo, bar ?>`
:
<indexterm>
<primary>foo, bar</primary>
</indexterm>
我还不担心那部分;让我感到困惑的是,ProcessingInstruction
在文档中到处都是,可能在任何元素下,所以我需要能够搜索整个树,找到它们,然后处理它们。我不知道如何使用minidom
遍历整个XML树。我是否遗漏了一些秘密方法/迭代器?这是我目前看到的内容:
Elementtree
具有优秀的Element.iter()
方法,即深度优先搜索,但不处理ProcessingInstruction
s。ProcessingInstruction
s没有标签名,所以我无法使用minidom
的getElementsByTagName
来搜索它们。xml.sax
的ContentHandler.processingInstruction
看起来像是只用于创建ProcessingInstruction
的
缺少创建我自己的深度优先搜索算法,是否有一种方法可以在XML文件中生成ProcessingInstruction
s列表,或者识别它们的父母?
使用lxml
模块的XPath API:
from lxml import etree
foo = StringIO('<foo><bar></bar></foo>')
tree = etree.parse(foo)
result = tree.xpath('//processing-instruction()')
节点测试处理指令()对任何处理指令都为真。处理指令()测试可以有一个参数Literal;在本例中,对于任何名称等于Literal值的处理指令都是如此。
引用
- XPath和XSLT与lxml
- XML路径语言1.0:节点测试