Python lxml 通过 id-tag 查找元素

问题描述 投票:0回答:2

我正在开发一个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 是我们用于库存的条形码中的编号。

到目前为止,我希望我的程序使用以下步骤:

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

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

无论我尝试什么,它都不会完全起作用。您对我可以使用什么有什么建议吗?

python xml xml-parsing lxml
2个回答
8
投票

检查id是否存在

您可以通过构造 XPath 表达式检查

@id
属性值来解决此问题。

将 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))

4
投票

您还可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.