2013-06-16 2 views
2

나는 많은 일을 절약하는 동시에 파이썬을 배우려고합니다.xml의 요소 텍스트를 변경하기 위해 사전을 사용하십시오.

이전 장치 ID와 새 장치 ID를 매핑하는 xml 파일과 사전 파일이 있습니다.

트리를 반복하고 사전 키와 일치하는 모든 logical_devid 하위 또는 각 사전 키의 logical_devid를 찾으려고합니다. 두 경우 모두 logical_devid.text를 새로운 값으로 대체하십시오.

XML은

0A40 0127 
0A41 0128 
0A42 0129 
0A43 012A 

내가 ElementTree 객체로 XML 파일을로드 한의

<lun> 
    <pseudo_dev>emcpower146a</pseudo_dev> 
    <udev>0x12b00000490</udev> 
    <product_id>symmetrix</product_id> 
    <frame_id>000192604705</frame_id> 
    <logical_devid_type>symm_id</logical_devid_type> 
    <logical_devid>0A43</logical_devid> 
</lun> 

텍스트 파일을 니펫을 나는 사전에 텍스트 파일을로드했습니다.

import xml.etree.cElementTree as ET 
tree = ET.ElementTree(file='emcpower.mappings') 
d = {} 
with open("translate-table.txt") as f: 
    for line in f: 
     (old, new) = line.split() 
     d[(old)] = new 

나는 반복하고 내가 가장 좋은 방법은 사전에 알려진 변경을 반복하는 것입니다 생각 elem.text 를 대체 할 수있는 가장 좋은 방법을 알아 내려고 붙어있어.
# :

for old_devid, new_devid in d.iteritems(): 

다음은 XML의 일종 여기

거의 내가 원하는 것을 전체 스크립트입니다 new_devid하는 old_devid, 설정 elem.text 일치 자식 logical_devid에 대한 찾을 수 있습니까!/usr/bin/python 부분을

try: 
     import xml.etree.cElementTree as ET 
except ImportError: 
     import xml.etree.ElementTree as ET 

#read in emcpower.mappings file as an entire xml tree of elements 
tree = ET.ElementTree(file='emcpower.mappings') 

# this defines a dictionary with the contents of the translate table which 
# is simply the old device ID as key and new device id as value 

d = {} 
with open("translate-table.txt") as f: 
     for line in f: 
       (old, new) = line.split() 
       d[(old)] = new 

for elem in tree.iterfind('lun/logical_devid'): 
     old_devid = elem.text 
     new_devid = d.get(old_devid) 
     try: 
       new_devid 
     except NameError: 
       new_devid = None 
     else: 
       if new_devid: 
         elem.text = new_devid 
         print "The logical_devid will be changed to", elem.text 



tree.write('emcpower.mappings.new',) 

답변

0

나는 그것이 tree을 반복하고 각 logical_devidd에 있는지 확인하는 것이 더 나을 것 같아요. 그런 다음 변수 (예를 들어, old_devid)에 logical_devid이 있으면 : 교체가있는 경우

new_devid = d.get(old_devid) 

가 표시됩니다. new_devid is null 인 경우 사전에 없습니다. 그렇지 않으면 new_devid이 트리의 현재 값 logical_devid을 대체해야합니다.

+0

감사합니다. – totallyGreg

관련 문제