首页 > 解决方案 > Python:如何调整 XML 文件中的值?

问题描述

学生在这里敏锐地学习python。我有一项任务,我需要在 XML 文件中减去一个值,但找不到办法。我已经搜索了一段时间并想出了接近的代码,但从来没有我需要的代码(下面的示例)。XML文件在下面以及我试图解决问题的一些代码块

XML 文件:

<departments>
<department>
    <name>Accounts</name>
    <balance>295.00</balance>
</department>
<department>
    <name>English</name>
    <balance>595.00</balance>
</department>
<department>
    <name>Mathematics</name>
    <balance>26.00</balance>
</department>
我的任务是使用 ElementTree 从某个部门减去一个值。我在网上的教程和代码的帮助下尝试了这个,但无济于事。IE:
import xml.etree.ElementTree as ET
tree = ET.parse('departments.xml') 
root = tree.getroot()
print(root)
for child in root:
    print(child.tag, child.attrib)
total = 150
ss = 1
while ss != 0:
    cu = input("Which Department (English, Mathematics, Accounts)" )
    if cu in ["English", "e", "E", "Eng", "eng"]: 
        for balance in (root[1]):
            balance = int(float((balance.text)))+10
            tree.write('output.xml')
            ss -= 1
    elif cu in ["Math", "math", "M", "m", "Mathematics", "mathematics"]:
        pc = "m"
        ss -= 1
    elif cu in ["accounts", "A", "a", "Accounts", "account", "Account"]:
        pc = "a"
        ss -= 1
    else:
        print("Error, type English, Mathematics, or Accounts")

输出如下:

<Element 'departments' at 0x0000021DF0E128B0>
department {}
department {}
department {}
Which Department (English, Mathematics, Accounts)e
Traceback (most recent call last):
  File "c:\Users\Vadder\Desktop\py\2021\Software\Teams_tasks\SAC\Code\V.1.1\dept_2.py", line 14, in <module>
    balance = int(balance.text)+10
ValueError: invalid literal for int() with base 10: 'English'
Press any key to continue . . .

这是我尝试的代码的一部分,用户将选择从英语部门中减去总数,但我似乎找不到选择'balance' 值的正确方法。我已经设法选择了所有内容,但在“.tag”和“.text”的帮助下。任何帮助都会受到重视,谢谢,Vadder

注意:此外,任何关于在此处发布时包含什么或使我的问题更简洁的提示将不胜感激。谢谢 :)

编辑:最终工作的代码如下,

import xml.etree.ElementTree as ET
tree = ET.parse(r'C:\Users\Vadder\Desktop\py\2021\Software\Teams_tasks\SAC\Code\V.1.1\departments.xml')
root = tree.getroot()
total = 150.0
ss = 1
while ss != 0:
     cu = input("Which Department (English, Mathematics, Accounts)" )
     if cu in ["English", "e", "E", "Eng", "eng"]:
        element = root[1].find('balance')
        if int(float(element.text)) >= total: 
            element.text = str(int(float((element.text)))-total)
            tree.write('output.xml')
        else:
            print("sorry, your department does not have the sufficent funds")        
        ss -= 1
     elif cu in ["Math", "math", "M", "m", "Mathematics", "mathematics"]:
        element = root[2].find('balance')
        if int(float(element.text)) >= total: 
            element.text = str(int(float((element.text)))-total)
            tree.write('output.xml')
        else:
            print("sorry, your department does not have the sufficent funds")        
        ss -= 1
     elif cu in ["accounts", "A", "a", "Accounts", "account", "Account"]:
        element = root[0].find('balance')
        if int(float(element.text)) >= total: 
            element.text = str(int(float((element.text)))-total)
            tree.write('output.xml')
        else:
            print("sorry, your department does not have the sufficent funds")        
        ss -= 1
     else:
        print("Error, type English, Mathematics, or Accounts")

它是一个非常僵化和重复的结构,这意味着我无法更改 XML 文件中的部门顺序,但它可以工作,而且我没有时间让它更具适应性。

标签: pythonxmlelementtree

解决方案


无论如何,我都不是 Python 方面的专家,但据我所知,我们在 xml 元素方面做得太过分了。

所以

    if cu in ["English", "e", "E", "Eng", "eng"]: 
    for balance in (root[1]):
        balance = float((balance.text))+10
        tree.write('output.xml')
        ss -= 1

变成

if cu in ["English", "e", "E", "Eng", "eng"]:
    element = root[0].find('balance')
    element.text = str(float((element.text)+10))
    tree.write('output.xml')
    ss -= 1

假设您知道要更新的部门的绝对索引。此外,假设您想保持相同水平的准确度,您不需要先将其设为浮点数,然后再设为整数,您只需使用浮点数即可。

我用于测试它的完整代码,与您的没有太大区别,只是用于ET.dump输出 XML 以使其在调试中更有用。

import xml.etree.ElementTree as ET

tree = ET.parse('departments.xml')
root = tree.getroot()
print(root)
for child in root:
    print(child.tag, child.attrib)
total = 150
ss = 1
while ss != 0:
   cu = input("Which Department (English, Mathematics, Accounts)" )
   if cu in ["English", "e", "E", "Eng", "eng"]:
        element = root[0].find('balance')
        element.text = str(int(float((element.text)))+10)
        tree.write('output.xml')
        ss -= 1
        ET.dump(tree)
    elif cu in ["Math", "math", "M", "m", "Mathematics", "mathematics"]:
        pc = "m"
        ss -= 1
    elif cu in ["accounts", "A", "a", "Accounts", "account", "Account"]:
        pc = "a"
        ss -= 1
    else:
        print("Error, type English, Mathematics, or Accounts")

推荐阅读