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 № 1Wł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.