/ / lxml.etree и xml.etree.ElementTree добавяне на имена без префикси (ns0, ns1 и т.н.) - python, xml, lxml, elementtree

lxml.etree и xml.etree.ElementTree добавяне на пространства на имена без префикси (ns0, ns1 и т.н.) - python, xml, lxml, elementtree

Има някакво решение за добавяне на имена без префикс (имам предвид тези ns0, ns1), които работят по всички приложения на etree или има работни решения за всеки един от тях?

Засега имам решения за:

  • lxml - аргумент nsmap на Element
  • (В) ElementTree(python 2.6+) - регистър на пространството за имена с празен низ като префикс

Проблемът е (c) ElementTree в python 2.5, знам, че има _namespace_map атрибут, но настройка на празна низ създава невалиден XML, настройка на None добавяне по подразбиране ns0 и т.н. namespaces, има ли работно решение?

Предполагам

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

е лоша идея?

Благодаря за помощта

Отговори:

3 за отговор № 1

Просто работя за вас.

Определете собствения си префикс:

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 )

След това сменете / премахнете префикса на изхода:

def writeDown(data, output_filename):

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

Вероятно има по-добро решение.


1 за отговор № 2

Използвах идеята на Jiri, но добавих допълнителен ред в случая, когато уникалният също е пространството за имена по подразбиране:

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 за отговор № 3

Използвам Python 3.3.1 и следните работи за мен:

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

Добрата страна е, че не трябва да влизате в частния xml.etree.ElementTree._namespace_map като Иржи предложи.

Виждам същото е налично и в Python 2.7.4.