3

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

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

对此:

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

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

  • Elementtree有很好的Element.iter()方法,即深度优先搜索,但它不处理ProcessingInstructions。

  • ProcessingInstructions 没有标签名称,所以我无法使用minidom's搜索它们getElementsByTagName

  • xml.sax'ContentHandler.processingInstruction看起来它只用于创建ProcessingInstructions。

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

4

1 回答 1

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() 对于任何处理指令都是正确的。processing-instruction() 测试可能有一个 Literal 参数;在这种情况下,对于名称等于 Literal 值的任何处理指令都是如此。

参考

于 2016-03-18T00:18:48.110 回答