2013-01-02 14 views
6

próbowałem zarejestrować nazw z tego:elementtree błąd nazw rejestr

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

ale to nie działa:

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

co z tego?


Dzięki Martinj

próbowałem - 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 

Wynik: (pusty)

2 .:

nsmap=root.nsmap 
print nsmap 

Wynik: AttributeError: " Obiekt "Element" nie ma atrybutu "ns mapa”

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 

Wynik: Działa OK.

Czy istnieje szansa na zarejestrowanie przestrzeni nazw jednocześnie? Następnie chciałbym użyć listInvoice.find ("inv: id"). Text zamiast listInvoice.find ('.// ​​{http://www.stormware.cz/schema/version_2/invoice.xsd} id') .text (ładniejszy kod i łatwe do odczytania)

+0

Ta odpowiedź wygląda bardzo podobnie do twojej http://stackoverflow.com/a/12861866/735204 –

Odpowiedz

14

Wygląda na to, że dokumentacja nie została zaktualizowana w zakresie używania przestrzeni nazw i .findall().

Funkcja .findall() (jak również .find(), .findtext() and .iterfind() ) takes a namespaces` argument, który ma być odwzorowaniem Jest to jedyna struktura konsultowany podczas szukania tagów.

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

Funkcja .register_namespace() przydaje się tylko przy serializacji drzewa do tekstu ponownie

+0

Dzięki, to działa! Dla '.get()' I potrzebne do przedrostka z '{namespace-URL}', np . 'element.get ({http://www.w3.org/1999/02/22-rdf-syntax-ns#} ID)'. –

+1

@Vincent: tak, dostęp do atrybutów nie obsługuje tłumaczenia prefiksu przestrzeni nazw i musisz przekazać w pełni kwalifikowany prefiks przestrzeni nazw. –

Powiązane problemy