我正在开发一个用于保存存储空间库存的python程序。在XML文档中,将保留墨粉量,我希望我的python程序能够添加,删除和显示不同打印机和不同颜色的墨粉量。
我的XML看起来像这样:
<?xml version="1.0"?>
<printer>
<t id="095205615111"> <!-- 7545 Magenta -->
<toner>7545 Magenta Toner</toner>
<amount>3</amount>
</t>
<t id="095205615104"> <!-- 7545 Yellow -->
<toner>7545 Yellow Toner</toner>
<amount>7</amount>
</t>
</printer>
id是我们用于库存的条形码中的数字。
到目前为止,我有这些步骤,我希望我的程序可以使用:
检查id是否存在(id-value是我的python程序中的一个变量,来自txt文件中的内容)
将xml文档中的金额值更改为+1或-1
无论我尝试什么,它都无法完全发挥作用。你对我能用什么有什么建议吗?
答案 0 :(得分:3)
检查id是否存在
您可以通过构造检查@id
属性值的XPath表达式来解决此问题。
将xml文档中的金额值更改为+1或-1
按特定t
找到id
节点后,您可以使用find()
找到内部amount
节点。然后,您可以获取.text
,将其转换为整数,更改它,转换回字符串并设置.text
属性。
工作示例:
from lxml import etree
data = """<?xml version="1.0"?>
<printer>
<t id="095205615111"> <!-- 7545 Magenta -->
<toner>7545 Magenta Toner</toner>
<amount>3</amount>
</t>
<t id="095205615104"> <!-- 7545 Yellow -->
<toner>7545 Yellow Toner</toner>
<amount>7</amount>
</t>
</printer>"""
root = etree.fromstring(data)
toner_id = "095205615111"
# find a toner
results = root.xpath("//t[@id = '%s']" % toner_id)
if not results:
raise Exception("Toner does not exist")
toner = results[0]
# change the amount
amount = toner.find("amount")
amount.text = str(int(amount.text) + 1)
print(etree.tostring(root))
答案 1 :(得分:1)
您还可以使用lxml.objectify
来处理它,这样可以更轻松地处理数据类型:
from lxml import objectify, etree
data = """<?xml version="1.0"?>
<printer>
<t id="095205615111"> <!-- 7545 Magenta -->
<toner>7545 Magenta Toner</toner>
<amount>3</amount>
</t>
<t id="095205615104"> <!-- 7545 Yellow -->
<toner>7545 Yellow Toner</toner>
<amount>7</amount>
</t>
</printer>"""
root = objectify.fromstring(data)
toner_id = "095205615111"
# find a toner
results = root.xpath("//t[@id = '%s']" % toner_id)
if not results:
raise Exception("Toner does not exist")
toner = results[0]
# change the amount
toner.amount += 1
# dump the tree object back to XML string
objectify.deannotate(root)
etree.cleanup_namespaces(root)
print(etree.tostring(root))
注意,如何实施金额变化:
toner.amount += 1