2016-12-16 1 views
1

나는 저장실의 목록을 관리하기 위해 파이썬 프로그램을 만들고있다. XML 문서에서 토너의 양은 유지 될 것이고 파이썬 프로그램이 다른 프린터와 다른 색상의 토너를 추가, 제거 및 표시 할 수 있기를 바랍니다.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가 우리가 재고에 사용하는 바코드의 숫자입니다.

지금까지 내가 내 프로그램을 사용하고자하는 다음 단계가 : ID가 존재

  1. 확인하는 경우을 (아이디 값은 내 파이썬 프로그램에서 변수가 TXT의 내용에서 파이프입니다 - 파일)

  2. 변경 일에 XML-문서의 양의 값 또는 -1 나는 완전히 작동하지하려고 무엇이든

. 내가 쓸 수있는 것에 대한 제안이 있니?

+3

시도한 코드를 게시하십시오. –

답변

2

확인은 ID가

존재하는 경우는 @id 속성 값을 확인 XPath 식을 구성하여이 문제를 해결할 수 있습니다. 특정 id하여 t 노드를 찾습니다되면

변경 일에 XML-문서의 양의 값 또는 -1

, 당신은 내부 amount 노드를 찾을 수 find()를 사용할 수 있습니다. 그런 다음 .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

시도해 보겠습니다. 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 
관련 문제