Python ElementTree insertBefore 命令

Python ElementTree insertBefore command

我想使用 PythonAndroid 清单 文件中插入 permissions和 ElementTree.

On Android Manifest permissions 需要在 application 节点之前所以我想使用 insertBefore()功能类似于 minidom。看起来它在 ElementTree 上根本不存在,有人遇到过这种问题吗? 顺便说一句,我不能使用 minidom.

我查看 google 搜索已经 2 个小时了,但找不到任何有趣的答案。

如果唯一的要求是 permissionapplication 之前,您可以确保通过在包含 Element 的位置 0 处插入 permissions(使用 insert方法)。

import StringIO
from xml.etree import ElementTree

xml_str = "<root><something></something><application></application></root>"
permission_str = "<permission></permission>"

tree = ElementTree.parse(StringIO.StringIO(xml_str))
perm_element = ElementTree.fromstring(permission_str)

# insert our permission element as the first child
tree.getroot().insert(0, perm_element)

print ElementTree.tostring(tree.getroot())

产量:

<root><permission /><something /><application /></root>

编辑:

如果您需要更细粒度的控制,您有几个选择。可能最好的选择是安装和使用 lxml,它确实具有 insertBefore 功能。

如果您更喜欢坚持 xml.etree,这里有一个更精确的插入新元素的方法:

import StringIO
from xml.etree import ElementTree


def get_index(root, element):
    for idx, child in enumerate(root):
        if element == child:
            return idx
    else:
        raise ValueError("No '%s' tag found in '%s' children" %
                         (element.tag, root.tag))

xml_str = """<root><something></something><application></application></root>"""
tree = ElementTree.parse(StringIO.StringIO(xml_str))

# print our tree pre-insertion
print ElementTree.tostring(tree.getroot())

permission_str = "<permission></permission>"
perm_element = ElementTree.fromstring(permission_str)
app_element = tree.getroot().find('./application')
app_index = get_index(tree.getroot(), app_element)
tree.getroot().insert(app_index, perm_element)

# print our tree post-insertion
print ElementTree.tostring(tree.getroot())

当 运行 时打印:

<root><something /><application /></root>
<root><something /><permission /><application /></root>

这有局限性 - 如果有多个相同的元素,它会在找到的第一个元素之前插入新元素(因此,如果您有两个具有相同属性的根应用程序子元素,并且想在第一个但在第二个之前,你就不走运了)。也就是说,我相信它可以满足您的需求。