2013-01-02 14 views
6

ho provato a registrarmi spazio dei nomi con questo:elementtree errore di registro namespace

ET.register_namespace("inv", "http://www.stormware.cz/schema/version_2/invoice.xsd") 

ma non funziona:

Traceback (most recent call last): 
    File "C:\tutorial\temp_xml2.py", line 34, in module> 
    for listInvoice in root.findall('inv:invoiceHeader'): 
    File "C:\Python27\LIB\xml\etree\ElementTree.py", line 390, in findall 
    return ElementPath.findall(self, path, namespaces) 
    File "C:\Python27\LIB\xml\etree\ElementPath.py", line 293, in findall 
    return list(iterfind(elem, path, namespaces)) 
    File "C:\Python27\LIB\xml\etree\ElementPath.py", line 259, in iterfind 
    token = next() 
    File "C:\Python27\LIB\xml\etree\ElementPath.py", line 83, in xpath_tokenizer 
    raise SyntaxError("prefix %r not found in prefix map" % prefix) 
SyntaxError: prefix 'inv' not found in prefix map 
>>> 

cosa c'è di sbagliato in questo?


Grazie Martinj

I cercato - 1 .:

for listInvoice in root.findall('inv:invoiceHeader', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd')): 
    invoiceHeader = listInvoice.find('inv:id', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd')).text 
    print invoiceHeader 

risultati: (vuoto)

2 .:

nsmap=root.nsmap 
print nsmap 

risultati: AttributeError: ' L'oggetto 'elemento non ha attributi' ns mappa'

3 .:

for listInvoice in root.findall('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}invoiceHeader'): 
    invoiceHeader = listInvoice.find('.//{http://www.stormware.cz/schema/version_2/invoice.xsd}id').text 
    print invoiceHeader 

Risultato: funziona bene.

C'è qualche possibilità di registrare spazi dei nomi in una volta? Quindi vorrei utilizzare listInvoice.find ('inv: id'). Text invece di listInvoice.find ('.// ​​{http://www.stormware.cz/schema/version_2/invoice.xsd} id') .text (codice più bello e di facile lettura)

+0

Questa risposta è molto simile alla tua http://stackoverflow.com/a/12861866/735204 –

risposta

14

Sembra che la documentazione non sia stata aggiornata su come utilizzare i namespace e .findall().

La funzione .findall() (così come .find(), .findtext() and .iterfind() ) takes a argomento namespaces`, che si suppone sia una mappatura che è l'unica struttura consultato quando trovare i tag:.

root.findall('inv:invoiceHeader', namespaces=dict(inv='http://www.stormware.cz/schema/version_2/invoice.xsd')) 

La funzione .register_namespace() è utile solo per serializzare di nuovo un albero in testo

+0

Grazie, questo funziona! Per '.get()' I necessario prefisso con '{namespace-URL}', ad es . 'Element.get ({} http://www.w3.org/1999/02/22-rdf-syntax-ns# ID)'. –

+1

@Vincent: sì, l'accesso agli attributi non ha supporto per la traduzione del prefisso dello spazio dei nomi ed è necessario passare il prefisso dello spazio dei nomi completo. –

Problemi correlati