2016-12-16 155 views
1

我正在研究一個用於保存存儲空間的python程序。在XML文檔中,調色劑的數量將保持不變,我希望我的python程序能夠爲不同的打印機和不同的顏色添加,移除和顯示調色劑的數量。Python lxml通過id-tag查找元素

我的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 -file)

  2. 更改XML文檔中量的值+1或-1

無論我嘗試它永遠不會奏效充分。你有什麼可以使用的建議嗎?

+3

發佈您的代碼,無論您嘗試 –

回答

2

檢查是否存在ID

您可以通過構建一個XPath表達式檢查@id屬性值解決這個問題。

更改XML文檔中量的值設定爲+1或-1

一旦由特定id定位t節點,則可以使用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)) 
+0

我會盡力而爲bac k結果。感謝您的快速回復! – Diego

+0

它似乎工作得很好。下次我會努力嘗試更多。感謝您的幫助! – Diego

+0

@Diego沒問題。試着張貼你下次嘗試的東西 - 這會帶來更多的關注,並幫助你理解你最好的問題。另外,考慮接受解決該主題的答案。謝謝。 – alecxe

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