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”。
问题描述
我正在尝试根据 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”。