2016-12-16 2 views
1

Я работаю над программой python для хранения инвентаря складской комнаты. В XML-документе количество тонеров будет сохранено, и я хочу, чтобы моя программа python могла добавлять, удалять и отображать количество тонеров для разных принтеров и разных цветов.Python lxml find element by 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> 

Идентификатор это номер от штрих-кода, который мы используем для проведения инвентаризации.

До сих пор у меня есть эти шаги, которые я хотел бы моя программа для использования:

  1. Проверьте, если идентификатор существует (идентификатор-значение переменной в моей питона программе конвейеру от содержания в TXT -file)

  2. Измените значение суммы в XML-документе, +1 или -1

Все, что я стараюсь никогда не работает в полной мере. Есть ли у вас предложения о том, что я могу использовать?

+3

напишите свой код, что бы вы ни попробовали –

ответ

2

Проверьте, если идентификатор существует

Вы можете решить эту проблему путем построения выражения XPath проверки значения в @id атрибута.

Изменить значение суммы в 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)) 
+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