Python:如何调整 XML 文件中的值?

Python: How do i adjust a value in a XML file?

学生在这里认真学习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\py21\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 . . .

这是我尝试使用的代码的一部分,用户会 select 从英语系中减去总数,但我似乎找不到 [=34= 的正确方法] 'balance' 的值。除了在“.tag”和“.text”的帮助下,我已经设法 select 一切。任何帮助都会受到重视 谢谢,维德

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

编辑:最终运行的代码如下,

import xml.etree.ElementTree as ET
tree = ET.parse(r'C:\Users\Vadder\Desktop\py21\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 文件中的部门顺序,但它有效,我没有时间让它更具适应性。

无论如何我都不是 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")