使用Python lxml删除处理指令

时间:2015-07-20 16:59:39

标签: python xml lxml

我正在使用python lxml库将XML文件转换为新模式,但是我在从XML主体解析处理指令时遇到了问题。

处理指令元素分散在整个XML中,如下例所示(它们都以“oasys”开头,以唯一代码结束):

string = "<text><?oasys _dc21-?>Text <i>contents</i></text>"

我无法通过lxml.etree.findall()方法找到它们,尽管etree.getchildren()会返回它们:

tree = lxml.etree.fromstring(string)
print tree.findall(".//")
>>>> [<Element i at 0x747c>]
print tree.getchildren()
>>>> [<?oasys _dc21-?>, <Element i at 0x747x>]
print tree.getchildren()[0].tag
>>>> <built-in function ProcessingInstruction>
print tree.getchildren()[0].tail
>>>> Text 

是否有使用getchildren()来解析和删除处理指令的替代方法,特别是考虑到它们嵌套在整个XML的各个级别?

1 个答案:

答案 0 :(得分:6)

您可以使用processing-instruction() XPath节点测试查找处理说明,并使用etree.strip_tags()将其删除。

示例:

from lxml import etree

string = "<text><?oasys _dc21-?>Text <i>contents</i></text>"
tree = etree.fromstring(string)

pis = tree.xpath("//processing-instruction()")
for pi in pis:
    etree.strip_tags(pi.getparent(), pi.tag)

print etree.tostring(tree)

输出:

<text>Text <i>contents</i></text>