2017-11-15 3 views
1

에서 XML에 자식 요소를 추가 I는 XML 파일의 요소가 : 나는 두 자식 요소를 추가 할 필요가파이썬

<condition> 
    <comparison compare="and"> 
    <operand idref="XXX" type="boolean" /> 
    </comparison> 
</condition> 

(자식 1과 자식 2)과 같은 :

<condition> 
    <child1 compare='and'> 
    <child2 idref='False' type='int' /> 
    <comparison compare="and"> 
     <operand idref="XXX" type="boolean" /> 
    </comparison> 
    </child1> 
</condition> 

나는 lxml을 사용하여 진행했다 :

from lxml import etree 
tree = etree.parse(xml_file) 
condition_elem = tree.find("<path for the condition block in the xml>") 
etree.SubElement(condition_elem, 'child1') 
tree.write('newXML.xml', encoding='utf-8', xml_declaration=True) 

이것은 아래의 요소 조건의 자식으로 child1 요소를 추가하고 나의 요구 사항을 만족시키지 못했다. t :

<condition> 
    <child1></child1> 
    <comparison compare="and"> 
    <operand idref="XXX" type="boolean" /> 
    </comparison> 
</condition> 

아이디어가 있으십니까? 감사는 etree 서브 모듈은, 내가 그에게로 다시에 자식 1 요소와 재료의 비교를 추가, 루트에서 비교 요소를 잘라 것입니다 이상 LXML의 객관화 서브 모듈 사용

답변

1

:

from lxml import objectify 

tree = objectify.parse(xml_file) 
condition = tree.getroot() 
comparison = condition.comparison 

M = objectify.ElementMaker(annotate=False) 
child1 = M("child1", {'compare': 'and'}) 
child2 = M("child2", {'idref': 'False', 'type': 'int'}) 

condition.remove(comparison) 
condition.child1 = child1 
condition.child2 = child2 
condition.child1.comparison = comparison 

ElementMaker이입니다 새로운 xml 요소를 만드는 데 사용하기 쉬운 도구입니다. 먼저 xml에 주석을 달지 않은 인스턴스 (M)를 인스턴스에 사용하여 인스턴스를 사용하여 자식을 만듭니다. 나머지는 상당히 자명하다.

+0

objectify는 그 (것)들에 관하여 약간 우습다 때문에, 태그 이름에 관하여 1 개의 단어. child1 및 child2 요소를 만들면 태그 이름, 즉 인용 된 "child1"/ "child2"를 결정하는 첫 번째 인수가됩니다. 명확성을 위해 나는 파이썬 변수에 대해서 같은 이름을 사용하고있다. 그러나 'condition'요소에 해당 요소를 추가하면 해당 태그 이름이 속성의 태그 이름으로 변경됩니다. "condition.evil_spawn = child1"을 사용했다면 조건의 자식 태그 이름은 자식이 아니라 "evil_spawn"이됩니다. 여기서 'child1'을 계속 사용하기 때문에 아무 것도 변경되지 않습니다. – brokkr

+0

동일한 레벨에 여러 개의 요소가있는 경우 어떻게해야합니까? – Bhaskar

+0

'comparison = condition.comparison'은 태그 이름이 'comparison'인 첫 번째 요소를 대상으로합니다. 'comparison' 엘리먼트의리스트를 얻으려면'condition.comparison [:]'을 사용하십시오. – brokkr