XML Etree 插入元素未更改 element.text 值

XML Etree insert element not changing the element.text value

问题描述

我正在尝试根据 DATE 元素的值将 "ORDER" 元素添加到 people.xml 文档记录:

people.xml:

<Data>
    <People>
        <Record>
            <NAME>STEVE</NAME>
            <DATE>2014-09-30</DATE>
            <AGE>25</AGE>
        </Record>
        <Record>
            <NAME>ANGIE</NAME>
            <DATE>2014-11-30</DATE>
            <AGE>25</AGE>
        </Record>
        <Record>
            <NAME>BART</NAME>
            <DATE>2014-12-31</DATE>
            <AGE>25</AGE>
        </Record>
        <Record>
            <NAME>LUCY</NAME>
            <DATE>2019-12-31</DATE>
            <AGE>25</AGE>
        </Record>
    </People>   
</Data>

顺序元素的值在以下字典中指定:

orderDictionary = 
{"2014-09-30":"4",
 "2014-11-30":"3",
 "2014-12-31":"2",
 "2019-12-31":"1"
}

所以修改后的XML文档应该是这样的:

<Data>
    <People>
        <Record>
            <NAME>STEVE</NAME>
            <DATE>2014-09-30</DATE>
            <AGE>25</AGE>
            <ORDER>4</ORDER>
        </Record>
        <Record>
            <NAME>ANGIE</NAME>
            <DATE>2014-11-30</DATE>
            <AGE>25</AGE>
            <ORDER>3</ORDER>
        </Record>
        <Record>
            <NAME>BART</NAME>
            <DATE>2014-12-31</DATE>
            <AGE>25</AGE>
            <ORDER>2</ORDER>
        </Record>
        <Record>
            <NAME>LUCY</NAME>
            <DATE>2019-12-31</DATE>
            <AGE>25</AGE>
            <ORDER>1</ORDER>
        </Record>
    </People>   
</Data>

解决问题的步骤

我尝试创建以下 python 脚本以将 ORDER 元素添加到 xml 文件的记录中。

import xml.etree.ElementTree as ET
tree = ET.parse("people.xml")
root = tree.getroot()

records = root.findall('People/Record')
orderDictionary = {
"2014-09-30":"4",
"2014-11-30":"3",
"2014-12-31":"2",
"2019-12-31":"1"
}

newElement = ET.Element("ORDER")

for record in records:
    date = record.find("DATE").text
    elementText = orderDictionary[date]
    newElement.text = elementText
    record.insert(3, newElement)

tree.write("peopleModified.xml")

在 运行 之后 peopleModified.xml 上面的代码如下所示:

<Data>
    <People>
        <Record>
            <NAME>STEVE</NAME>
            <DATE>2014-09-30</DATE>
            <AGE>25</AGE>
            <ORDER>1</ORDER>
        </Record>
        <Record>
            <NAME>ANGIE</NAME>
            <DATE>2014-11-30</DATE>
            <AGE>25</AGE>
            <ORDER>1</ORDER>
        </Record>
        <Record>
            <NAME>BART</NAME>
            <DATE>2014-12-31</DATE>
            <AGE>25</AGE>
            <ORDER>1</ORDER>
        </Record>
        <Record>
            <NAME>LUCY</NAME>
            <DATE>2019-12-31</DATE>
            <AGE>25</AGE>
            <ORDER>1</ORDER>
        </Record>
    </People>   
</Data>

出于某种原因,ORDER 元素的值始终为“1”。 我还尝试在 for 循环中打印 newElement.text 并且打印的值是正确的。

我很确定解决方案很简单,但我不知道如何解决:(

问题出在这一行 新元素 = ET.Element("ORDER")

这一行必须放在for循环中,每次迭代都必须重新创建该元素,否则它会保持相同的引用并且实际输出时的最终值 xml 是来自最后一次迭代,在上述情况下为“1”。