2015-12-17 119 views
2

如何刪除或刪除server1包括標籤的所有條目?我試圖用etree刪除功能,但它不是幫助etree xml解析和刪除

<hosts> 
    <host instances="" name="*" roles="alpha"> 
     <tags/> 
    </host> 
    <host instances="" name="server1" id="alpha,beta"> 
     <tags> 
     <tag app-id="1" instance="1" name="alpha"/> 
     <tag app-id="2" instance="2" name="beta"/> 
     </tags> 
    </host> 
    <host instances="" name="server2" id="beta,gama"> 
     <tags> 
     <tag app-id="1" instance="1" name="beta"/> 
     <tag app-id="2" instance="2" name="gama"/> 
     </tags> 
    </host> 
</hosts> 


def main1(file=outfile): 
tree = et.parse(file) 
root = tree.getroot() 
thingy = root.find('hosts') 
for thing in thingy: 
    if "server1" in thing.get('name'): 
     root.remove(thing) 
     #thingy.remove(thing) 
    print thingy 

回答

3

需要父對象從HTML/XML刪除其子。

使用getparent()方法獲取父項,然後使用remove()方法刪除其chid標記。

演示

>>> import lxml.etree as PARSER 
>>> root = PARSER.fromstring(data) 
>>> root.xpath("//hosts/host[@name='server1']") 
[<Element host at 0xb6d2ce6c>] 
>>> a = root.xpath("//hosts/host[@name='server1']") 
>>> for i in a: 
... pp = i.getparent() 
... pp.remove(i) 
... 
>>> PARSER.tostring(root, method="xml") 

A.find回報None對象下面的代碼。

>>> thingy = root.find('hosts') 
>>> thingy 

這應該是thingy = root.find('host')

B.使用xpath方法來獲取目標的標籤。