Python lxml通过id-tag查找元素

时间:2016-12-16 14:47:50

标签: python xml xml-parsing lxml

我正在开发一个用于保存存储空间库存的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-value是我的python程序中的一个变量,来自txt文件中的内容)

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

  3. 无论我尝试什么,它都无法完全发挥作用。你对我能用什么有什么建议吗?

2 个答案:

答案 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