2013-07-11 3 views
1

특정 태그를 찾아서 그 내용을 기반으로 부모 태그와 내용을 제거하려고하지만 답변을 찾을 수 없습니다. 내가하고 싶은 것은 그것이 내가 <role>Primary</role>가에 존재하는 전체 <crew> 블록을 삭제할 않는 경우 <role>Primary</role>가하는 <crew> 블록에 존재하는지 확인하기 위해 검색이의 부모,자식 태그 값을 기반으로 태그 및 내용을 제거합니다 - python lxml

<video> 
    <crew> 
     <member billing="top"> 
     <name>Some Guy</name> 
     <roles> 
      <role>Painter</role> 
      <role>Decorator</role> 
     </roles> 
     </crew> 
     <crew billing="top"> 
     <name>Another Guy</name> 
     <roles> 
      <role>Primary</role> 
     </roles> 
     </crew> 
    </crew> 
</video> 

입니다 : 여기 내 XML이다.

<video> 
    <crew> 
     <member billing="top"> 
     <name>Some Guy</name> 
     <roles> 
      <role>Painter</role> 
      <role>Decorator</role> 
     </roles> 
     </crew> 
</video> 

그것은 끝에 때로는 아니라 어쩌면 다른 많은 <crew> 태그 내에 묻혀있는, 그래서 그 블록이 <role>Primary</role> 포함 된 경우 내가이 상주하는 전체 <crew> 블록을 제거 할 것을 알고 : 그래서 결과가 될 것입니다. 나는 시도했다 :

for find1 in root.iter(tag='role'): 
    find1 = find1.text 
    if find1 == "Primary": 
     path = tree.xpath('//video/crew') 
     etree.strip_elements(path, 'member') 

하지만이 모든 <crew> 태그를 제거하고이 내용을합니다. 친절하게 생각합니다.

+0

을 감안할 때 XML이 유효하지 않습니다. – falsetru

답변

2

사용하여 XPath는 :

for crew in root.xpath('.//crew[descendant::role[contains(text(), "Primary")]]'): 
    crew.getparent().remove(crew) 
+0

아주 좋은 해결책, 많은 감사합니다. – speedyrazor

+0

그건 작동하지만, 두 승무원을 제거, 나는 오직 그것에서 기본으로 제거하고 싶습니다. – speedyrazor

+0

@ user2446702, 질문에 주어진 xml을 사용하면 내 대답 코드는 '다른 가이'만 제거합니다. – falsetru

관련 문제