2015-05-14 32 views
5

Removing child elements in XML using python繼...如何從lxml樹中去除名稱空間?

感謝@Tichodroma,我有這樣的代碼:

如果你可以使用lxml,試試這個:

import lxml.etree 

tree = lxml.etree.parse("leg.xml") 
for dog in tree.xpath("//Leg1:Dog", 
         namespaces={"Leg1": "http://what.not"}): 
    parent = dog.xpath("..")[0] 
    parent.remove(dog) 
    parent.text = None 
tree.write("leg.out.xml") 

現在leg.out.xml看起來是這樣的:

<?xml version="1.0"?> 
<Leg1:MOR xmlns:Leg1="http://what.not" oCount="7"> 
    <Leg1:Order> 
    <Leg1:CTemp id="FO"> 
     <Leg1:Group bNum="001" cCount="4"/> 
     <Leg1:Group bNum="002" cCount="4"/> 
    </Leg1:CTemp> 
    <Leg1:CTemp id="GO"> 
     <Leg1:Group bNum="001" cCount="4"/> 
     <Leg1:Group bNum="002" cCount="4"/> 
    </Leg1:CTemp> 
    </Leg1:Order> 
</Leg1:MOR> 

如何修改我的代碼以刪除Leg1:名稱來自所有元素標籤名稱的空格前綴?

+0

我看了一下,不能得到它的工作。 – LCGA

+1

可能的重複[刪除命名空間和前綴從XML在Python中使用lxml](https://stackoverflow.com/questions/18159221/remove-namespace-and-prefix-from-xml-in-python-using-lxml) –

回答

6

一種可能的方式從每個元素中刪除命名空間前綴:

def strip_ns_prefix(tree): 
    #iterate through only element nodes (skip comment node, text node, etc) : 
    for element in tree.xpath('descendant-or-self::*'): 
     #if element has prefix... 
     if element.prefix: 
      #replace element name with its local name 
      element.tag = etree.QName(element).localname 
    return tree 

另一個版本,其具有的命名空間中檢查xpath代替使用if聲明:

def strip_ns_prefix(tree): 
    #xpath query for selecting all element nodes in namespace 
    query = "descendant-or-self::*[namespace-uri()!='']" 
    #for each element returned by the above xpath query... 
    for element in tree.xpath(query): 
     #replace element name with its local name 
     element.tag = etree.QName(element).localname 
    return tree 
+2

謝謝你的完美作品。它也完全符合我的方法。 – LCGA

+2

您可能還需要調用'etree.cleanup_namespaces(tree)' - 否則'etree.tostring(tree)'仍然會顯示名稱空間。 – marbu

+2

第二種方法更健壯(默認命名空間) –

2

下面的函數可以被用於從一個lxml樹剝離名稱空間:

def strip_ns(tree): 
    for node in tree.iter(): 
     try: 
      has_namespace = node.tag.startswith('{') 
     except AttributeError: 
      continue # node.tag is not a string (node is a comment or similar) 
     if has_namespace: 
      node.tag = node.tag.split('}', 1)[1] 
+0

手動字符串解析不是一個好主意。 –

相關問題