python
  • xml
  • elementtree
  • 2012-05-25 12 views 10 likes 
    10

    z tym pytonem 2.7.3 (lub 2.7.0) kod Chcę zmienić wartość atrybutu "android: versionCode = '2" ", który ma prefiks namespace "android":Python 2.7: obiekt typu "ElementTree" nie ma atrybutu "register_namespace"

    #!/usr/bin/python 
    from xml.etree.ElementTree import ElementTree, dump 
    import sys, os 
    
    # Problem here: 
    ElementTree.register_namespace("android", "http://schemas.android.com/apk/res/android") 
    
    tree = ElementTree() 
    tree.parse("AndroidManifest.xml") 
    root = tree.getroot() 
    root.attrib["{http://schemas.android.com/apk/res/android}versionCode"] = "3" 
    
    dump(tree) 
    

    Gdy nie przy użyciu linii kodu skomentował z "problemem", ElementTree jest auto-nazywania alias namespace dla http://schemas.android.com/apk/res/android do "NS0" (w wyniku „NS0: versionCode = '3'”.

    Dlatego używam ElementTree.register_namespace mapować URL przestrzeni nazw do alias "android", który jest udokumentowany here.

    Błąd pojawia się przy próbie to zrobić:

    AttributeError: type object 'ElementTree' has no attribute 'register_namespace' 
    

    ktoś wie dlaczego to nie działa? Ta metoda powinna być dostępna w pythonie 2.7.

    Odpowiedz

    23

    register_namespace() is a function contained within the ElementTree module.
    Jest nie zawarte w klasie ElementTree ...

    Na marginesie: Ze względu na zamieszanie, które jest czasem spowodowane przez to jest ona na ogół nie zaleca się używać tej samej nazwy zarówno dla modułu i klasy. Ale nie zamierzamy złamać kodu produkcyjnego, zmieniając nazwę powszechnie używanego modułu.

    Wystarczy zmienić kod:

    #!/usr/bin/python 
    import xml.etree.ElementTree as ET # import entire module; use alias for clarity 
    import sys, os 
    
    # note that this is the *module*'s `register_namespace()` function 
    ET.register_namespace("android", "http://schemas.android.com/apk/res/android") 
    
    tree = ET.ElementTree() # instantiate an object of *class* `ElementTree` 
    tree.parse("AndroidManifest.xml") 
    root = tree.getroot() 
    root.attrib["{http://schemas.android.com/apk/res/android}versionCode"] = "3" 
    
    ET.dump(tree) # we use the *module*'s `dump()` function 
    
    +0

    genialny, to wszystko. Dziękuję Bernie. – derFunk

    +0

    Pozdrawiam, kolego. Szczęśliwe kodowanie do ciebie – bernie

    +0

    Jest 5 podobnych pytań na temat przepełnienia stosu i jest to jedyna prawidłowa odpowiedź, dziękuję. – seibelj

    Powiązane problemy