Python LXML通过ID标记查找元素

Die*_*ego 1 python xml lxml xml-parsing

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

id是我们用于库存的条形码中的编号。

到目前为止,我已经希望我的程序使用这些步骤:

  1. 检查id是否存在(id-value是我的python程序中从txt文件中的内容通过管道传递的变量)

  2. 将xml文档中的amount值更改为+1或-1

无论我尝试什么,它都无法充分发挥作用。您对我可以使用的东西有什么建议吗?

ale*_*cxe 5

检查id是否存在

您可以通过构造一个检查@id属性值的XPath表达式来解决此问题。

将xml文档中的amount值更改为+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))
Run Code Online (Sandbox Code Playgroud)