【问题标题】:XML Etree insert element not changing the element.text valueXML Etree插入元素不改变element.text值
【发布时间】:2020-01-15 13:20:53
【问题描述】:

问题描述

我正在尝试根据 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>

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

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 并且打印的值是正确的。

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

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    问题出在这一行 newElement = ET.Element("订单")

    这一行必须放在for循环中,每次迭代都必须重新创建元素,否则它保持相同的引用,并且当它实际输出xml时的最终值是最后一次迭代的值,在以上案例“1”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2011-12-22
      相关资源
      最近更新 更多