【问题标题】:Finding and converting XML processing instructions using Python使用 Python 查找和转换 XML 处理指令
【发布时间】:2015-08-02 07:42:21
【问题描述】:

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

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

到这里:

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

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

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

  • ProcessingInstructions 没有标签名称,所以我无法使用minidomgetElementsByTagName 搜索它们。

  • xml.saxContentHandler.processingInstruction 看起来只用于创建ProcessingInstructions。

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

【问题讨论】:

  • 对我来说听起来像是预处理 - 将 PI 转换为普通标签,为此编写一些专门的小型预处理脚本。然后,使用 ElementTree 进行处理。
  • 你考虑过lxml吗? tree.xpath('//processing-instruction()') 应该返回树中的所有 PI...

标签: python xml elementtree minidom processing-instruction


【解决方案1】:

使用 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 值的处理指令都是如此。

参考文献

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2012-01-17
    • 2014-09-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多