2015-05-14 15 views
5

Kontynuując Removing child elements in XML using python ...Jak mogę usunąć przestrzenie nazw z drzewa lxml?

Dzięki @Tichodroma, mam ten kod:

jeśli można użyć lxml, spróbuj tego:

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") 

Teraz leg.out.xml wygląda następująco:

<?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> 

Jak zmodyfikować mój kod, aby usunąć nazwę Leg1: prefiks spacji ze wszystkich nazw znaczników elementów?

+0

Spojrzałem i nie mogłem go uruchomić. – LCGA

+1

Możliwy duplikat [Usuń przestrzeń nazw i prefiks z xml w pythonie używając lxml] (https://stackoverflow.com/questions/18159221/remove-namespace-and-prefix-from-xml-in-python-using-lxml) –

Odpowiedz

6

Jednym z możliwych sposobów, aby usunąć namespace prefix z każdego elementu:

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 

innej wersji, która ma nazw zameldowaniem xpath zamiast używać instrukcji 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

Dzięki temu działa idealnie. Doskonale pasuje również do moich metod. – LCGA

+2

Możesz także potrzebować wywołania 'etree.cleanup_namespaces (tree)' - w przeciwnym razie 'etree.tostring (tree)' nadal będzie wyświetlać przestrzenie nazw. – marbu

+2

Druga metoda jest bardziej niezawodna (do domyślnych przestrzeni nazw) –

2

następująca funkcja może być używana do paska nazw z lxml drzewa:

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

ręczne parsowanie łańcuchów nie jest dobrym pomysłem. –