2014-05-13 2 views
0

임 요소 주어진 모든 형제를 제거하려고 :제거 요소 형제

<xml> 
    <letter name="A"> 
      <letter name="B"> 
        <letter name="G"> 
        </letter> 
      </letter> 
      <letter name="E"> 
       <letter name="F"> 
       </letter> 
      </letter> 
    </letter> 
</xml> 

xpath 또는 find를 반복적으로 사용하지 않고.

어떻게 할 수 있습니까?

이 내가 단지

import xml.etree.ElementTree as etree 
data = """ 

<xml> 
    <letter name="A"> 
      <letter name="B"> 
        <letter name="C"> 
        </letter> 
        <letter name="D"> 
        </letter> 
        <letter name="G"> 
        </letter> 
        <letter name="H"> 
        </letter> 
        <letter name="I"> 
        </letter> 
      </letter> 
      <letter name="E"> 
       <letter name="F"> 
       </letter> 
      </letter> 
    </letter> 
</xml> 

""" 
tree =etree.fromstring(data) 


for parent in tree.getiterator(): 
    for child in parent: 
     for subchild in child: 
      if subchild.attrib.get('name') == "G": 
       parent_name = child.attrib.get('name') 
       #print parent_name 

for parent in tree.getiterator(): 
    if parent.attrib.get('name') == parent_name: 
     for child in parent: 
      if child.attrib.get('name') == "G": 
       print "not this" 
      else: 
       parent.remove(child) 


print etree.tostring(tree) 

건배를 작성하는 코드입니다!

+0

이미 시도한 코드를 공유 할 수 있습니까? –

+1

xpath를 사용하지 않고? 왜? – roippi

+0

도움이 필요하십니까? @JustinBarber ?? – ccamacho

답변

1

가까이 있습니다. 단어 G을 찾으면 이름이 G 인 모든 요소를 ​​반복해야합니다. 그래서 만약 당신이 (당신의 요구 사항에 따라, 오히려 XPath는보다 반복을 사용하거나 찾기)이 라인을 따라 뭔가 더를 사용하는 것이 좋습니다 :

>>> def remove(name, value, root): 
    """ 
    Iterates through the @root element and removes elements 
    where the @name != @value. 
    """ 
    for element in root: 
     if element.attrib.get(name) != value: 
      root.remove(element) 


>>> def remove_siblings_of(name, value, root): 
    """ 
    Recursively removes from the @root element all elements which (1) do 
    not have @name == @value but (2) do have a sibling where @name == @value. 
    """ 
    for element in root: 
     if element.attrib.get(name) == value: 
      remove(name, value, root) # need to reiterate through element now to remove previous siblings 
     if len(element): 
      remove_siblings_of(name, value, element) 
    return root 

을 당신이 당신의 XML에 후자의 기능을 사용할 때, 당신은 당신이 결과를 얻을 것이다 찾고 :

>>> siblings_removed = remove_siblings_of('name', 'G', root) 
>>> print et.tostring(siblings_removed) 
<xml> 
    <letter name="A"> 
      <letter name="B"> 
        <letter name="G"> 
        </letter> 
        </letter> 
      <letter name="E"> 
       <letter name="F"> 
       </letter> 
      </letter> 
    </letter> 
</xml> 
+0

감사합니다 !!! 이것은 잘 작동합니다! – ccamacho