使用 Python 查找和转换 XML 处理指令
Finding and converting XML processing instructions using Python
我们正在将古老的 FrameMaker 文档转换为 XML。我的工作是转换这个:
<?FM MARKER [Index] foo, bar ?>`
对此:
<indexterm>
<primary>foo, bar</primary>
</indexterm>
我不担心那部分(还);令我感到困惑的是 ProcessingInstruction
遍及整个文档并且可能在任何元素下,因此我需要能够搜索整个树,找到它们,然后处理它们。我不知道如何使用 minidom
遍历整个 XML 树。我是否遗漏了一些秘密 method/iterator?这是我到目前为止所看到的:
Elementtree
有出色的 Element.iter()
方法,这是一个 depth-first 搜索,但它不处理 ProcessingInstruction
s。
ProcessingInstruction
s 没有标签名称,所以我无法使用 minidom
的 getElementsByTagName
.
[= 搜索它们44=]
xml.sax
的ContentHandler.processingInstruction
好像只用来创建ProcessingInstruction
s.
如果没有创建我自己的 depth-first 搜索算法,有没有办法在 XML 文件中生成 ProcessingInstruction
的列表,或者识别他们的 parents ?
像这样使用 lxml
模块的 XPath API:
from lxml import etree
foo = StringIO('<foo><bar></bar></foo>')
tree = etree.parse(foo)
result = tree.xpath('//processing-instruction()')
The node test processing-instruction() is true for any processing instruction. The processing-instruction() test may have an argument that is Literal; in this case, it is true for any processing instruction that has a name equal to the value of the Literal.
参考资料
我们正在将古老的 FrameMaker 文档转换为 XML。我的工作是转换这个:
<?FM MARKER [Index] foo, bar ?>`
对此:
<indexterm>
<primary>foo, bar</primary>
</indexterm>
我不担心那部分(还);令我感到困惑的是 ProcessingInstruction
遍及整个文档并且可能在任何元素下,因此我需要能够搜索整个树,找到它们,然后处理它们。我不知道如何使用 minidom
遍历整个 XML 树。我是否遗漏了一些秘密 method/iterator?这是我到目前为止所看到的:
Elementtree
有出色的Element.iter()
方法,这是一个 depth-first 搜索,但它不处理ProcessingInstruction
s。
[= 搜索它们44=]ProcessingInstruction
s 没有标签名称,所以我无法使用minidom
的getElementsByTagName
.xml.sax
的ContentHandler.processingInstruction
好像只用来创建ProcessingInstruction
s.
如果没有创建我自己的 depth-first 搜索算法,有没有办法在 XML 文件中生成 ProcessingInstruction
的列表,或者识别他们的 parents ?
像这样使用 lxml
模块的 XPath API:
from lxml import etree
foo = StringIO('<foo><bar></bar></foo>')
tree = etree.parse(foo)
result = tree.xpath('//processing-instruction()')
The node test processing-instruction() is true for any processing instruction. The processing-instruction() test may have an argument that is Literal; in this case, it is true for any processing instruction that has a name equal to the value of the Literal.
参考资料