/ / lxml.etree i xml.etree.ElementTree dodawanie przestrzeni nazw bez prefiksów (ns0, ns1 itd.) - python, xml, lxml, elementtree

lxml.etree i xml.etree.ElementTree dodawanie przestrzeni nazw bez prefiksów (ns0, ns1 itp.) - python, xml, lxml, elementtree

Istnieje dowolne rozwiązanie do dodawania przestrzeni nazw bez prefiksu (mam na myśli te ns0, ns1), które pracują nad wszystkimi wersjami systemu lub istnieją działające rozwiązania dla każdego z nich?

Na razie mam rozwiązania dla:

  • lxml - argument nsmap elementu
  • (c) ElementTree(python 2.6+) - rejestruj metodę przestrzeni z pustym łańcuchem jako prefiksem

Problem polega na tym, (c) ElementTree w Pythonie 2.5, Wiem, że istnieje atrybut _namespace_map, ale ustawienie go na pusty ciąg znaków, tworząc nieprawidłowy kod XML, ustawiając go na Brak dodając domyślne przestrzenie nazw ns0 itp., Czy istnieje jakieś działające rozwiązanie?

zgaduję

Element("foo", {"xmlns": "http://my_namespace_url.org/my_ns"})

to zły pomysł?

Dzięki za pomoc

Odpowiedzi:

3 dla odpowiedzi № 1

Właśnie dla ciebie pracuję.

Zdefiniuj swój własny prefiks:

unique = "bflmpsvz"

my_namespaces = {
"http://www.topografix.com/GPX/1/0" :    unique,
"http://www.groundspeak.com/cache/1/0" : "groundspeak",
}
xml.etree.ElementTree._namespace_map.update( my_namespaces )

A następnie, zastąp / usuń prefiks na wyjściu:

def writeDown(data, output_filename):

data.write(output_filename)
txt = file(output_filename).read()
txt = txt.replace(unique+":","")
file(output_filename,"w").write(txt)

Prawdopodobnie istnieje lepsze rozwiązanie.


1 dla odpowiedzi nr 2

Użyłem pomysłu Jiri, ale dodałem dodatkowy wiersz w przypadku, gdy unique jest również domyślną przestrzenią nazw:

def writeDown(data, output_filename):

data.write(output_filename)
txt = file(output_filename).read()
txt = txt.replace(unique+":","")
txt = txt.replace("xmlns:"+unique,"xmlns")
file(output_filename,"w").write(txt)

0 dla odpowiedzi № 3

Używam Pythona 3.3.1 i następujących prac dla mnie:

xml.etree.ElementTree.register_namespace("", "http://your/uri")
data.write(output_filename)

Plusem jest to, że nie musisz mieć dostępu do prywatnej mapy xml.etree.ElementTree._namespace jako Jiri zasugerował.

Widzę, że to samo jest również dostępne w Pythonie 2.7.4.