Python ElementTree insertBefore 命令
Python ElementTree insertBefore command
我想使用 Python 在 Android 清单 文件中插入 permission
s和 ElementTree.
On Android Manifest permission
s 需要在 application
节点之前所以我想使用 insertBefore()
功能类似于 minidom。看起来它在 ElementTree 上根本不存在,有人遇到过这种问题吗?
顺便说一句,我不能使用 minidom.
我查看 google 搜索已经 2 个小时了,但找不到任何有趣的答案。
如果唯一的要求是 permission
在 application
之前,您可以确保通过在包含 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>
这有局限性 - 如果有多个相同的元素,它会在找到的第一个元素之前插入新元素(因此,如果您有两个具有相同属性的根应用程序子元素,并且想在第一个但在第二个之前,你就不走运了)。也就是说,我相信它可以满足您的需求。
我想使用 Python 在 Android 清单 文件中插入 permission
s和 ElementTree.
On Android Manifest permission
s 需要在 application
节点之前所以我想使用 insertBefore()
功能类似于 minidom。看起来它在 ElementTree 上根本不存在,有人遇到过这种问题吗?
顺便说一句,我不能使用 minidom.
我查看 google 搜索已经 2 个小时了,但找不到任何有趣的答案。
如果唯一的要求是 permission
在 application
之前,您可以确保通过在包含 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>
这有局限性 - 如果有多个相同的元素,它会在找到的第一个元素之前插入新元素(因此,如果您有两个具有相同属性的根应用程序子元素,并且想在第一个但在第二个之前,你就不走运了)。也就是说,我相信它可以满足您的需求。