如何使用python解决下一个iter(xml.etree.ElementTree)?

2024-06-17 16:16:11 发布

您现在位置:Python中文网/ 问答频道 /正文

  <storage>
    <record>
      <values>
        <points>99999999</points>
        <points>Mr</points>
        <points>Marvin</points>
        <points>Homes</points>
        <points>hardware</points>
        <points>true</points>
        <points>de</points>
        <points>6</points>
        <points>false</points>
      </values>
    </record>
  </storage>

你好

我试图用python()更改一些xml值xml.etree.ElementTree). 这是xml数据的一小部分。在

^{pr2}$

对下一个iter有什么建议吗? xml文件有许多标记,称为<;“points”>;并且值总是不同的。在


Tags: falsetruedestoragexmlrecordhardwarepoints
1条回答
网友
1楼 · 发布于 2024-06-17 16:16:11

我假设您正在使用xml.etree.ElementTree,因为它是标准库的一部分。考虑以下片段:

appelation = re.compile('Mr')
points = root.iter('points')
for node in points:
    if appelation.match(node.text):
        node.text = 'Monsieur'
        node = next(points)
        node.text = 'Francois'
        break

在元素树.转储(根目录)

在这个片段中,points是一个iterable,我们使用它来获取下一个点并进行搜索。一旦找到要查找的节点(Mr),我们就可以对该节点和下一个节点执行操作(通过对所述iterable调用next)。在

输出:

^{pr2}$

更新

如果要修改此节点、下一个节点和上一个节点;则需要跟踪上一个节点,因为iterable无法返回。最简单的方法是使用堆栈(一个listcollections.deque就可以了):

appelation = re.compile('Mr')
points = root.iter('points')
nodes_stack = []
for node in points:
    if appelation.match(node.text):
        # Modify this node
        node.text = 'Monsieur'

        # Modify next node
        next_node = next(points)
        next_node.text = 'Francois'

        # Modify previous node
        previous_node = nodes_stack.pop()
        previous_node.text = 'modified'

        # Keep popping the stack the get to previous nodes
        # in reversed order

        ElementTree.dump(root)
        break
    else:
        nodes_stack.append(node)

相关问题 更多 >