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

时间:2016-10-28 12:38:55

标签: python xml elementtree

  <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.etree.ElementTree)更改一些xml值。 这只是xml数据的一小部分。

appelation=re.compile("Mr")
for fname in root.iter('points'):

    if appelation.match(str(pTest)):
        fname.text="New Mr/Mrs"
        ## here i am trying to edit the next iter (<points>Marvin</points>)
        ##fname.next().text="New name" -> doesnt work

有任何建议如何解决下一个问题吗? xml文件有很多名为&lt;&#34; points&#34;&gt;的标签。而值总是不同的。

1 个答案:

答案 0 :(得分:0)

我假设您正在使用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

ElementTree.dump(根)

在此代码段中,points是一个可迭代的,我们用它来获取下一个点并进行搜索。一旦我们找到了我们正在寻找的节点(先生),我们就可以对该节点和下一个节点做一些事情(通过在所述迭代上调用next)。

输出:

<storage>
    <record>
      <values>
        <points>99999999</points>
        <points>Monsieur</points>
        <points>Francois</points>
        <points>Homes</points>
        <points>hardware</points>
        <points>true</points>
        <points>de</points>
        <points>6</points>
        <points>false</points>
      </values>
    </record>
  </storage>

更新

如果要修改此节点,下一个节点和上一个节点;那么你需要跟踪前一个节点,因为迭代器无法返回。最简单的方法是使用堆栈(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)