2016-03-13 2 views
2

Я пытаюсь сделать простой XML-конвертер для формата TMX с помощью xml.etree. Как создать атрибут языка, который выглядит следующим образом: xml:lang.С помощью xml.etree, как мне создать атрибут namespaced "XML: lang"?

Что я пробовал:

root = et.Element("tmx") 
    body = et.SubElement(root, "body") 
    tu = et.SubElement(body, "tu") 
    tuv_en = et.SubElement(tu, "tuv", xml:lang="en") # 'xml:lang' gets error 
    tuv_zh = et.SubElement(tu, "tuv", xml:lang="zh") 
    seg_en = et.SubElement(tuv_en, "segment").text="en text." 
    seg_zh = et.SubElement(tuv_zh, "segment").text="zh text." 
    tree = et.ElementTree(root) 
    tree.write(file + ".xml") 

Что я хочу:

<tmx> 
    <body> 
    <tu> 
     <tuv xml:lang="en"> 
     <seg>en text.</seg> 
     </tuv> 
     <tuv xml:lang="zh"> 
     <seg>zh text.</seg> 
     </tuv> 
    </tu> 
    </body> 
</tmx> 
+0

Вы пробовали 'et.register_namespace'? –

ответ

3

Установите аргумент attrib ключевое слово:

import xml.etree.ElementTree as et 

root = et.Element("tmx") 
body = et.SubElement(root, "body") 

tu = et.SubElement(body, "tu") 
et.SubElement(tu, "tuv", attrib={"xml:lang": "en"}) 
et.SubElement(tu, "tuv", attrib={"xml:lang": "zh"}) 

print(et.tostring(body)) 

Это будет производить:

<body><tu><tuv xml:lang="en" /><tuv xml:lang="zh" /></tu></body> 
1

Если у вас есть существующий LXML etree РОМ и не могут использовать ElementTree, вы можете установить атрибут как это:

from lxml import etree 

element = etree.Element("element") 

# This won't work: element.set("xml:lang", "en") 
element.set("{http://www.w3.org/XML/1998/namespace}lang", "en") 

print(etree.tostring(element)) 

Результат:

<element xml:lang="en"/> 
+0

Ничего себе, большой улов! Он также работает с ElementMaker. – mnv