如何将xmi:version =“ 2.0”属性添加到元素

时间:2019-10-31 11:20:22

标签: python-3.x xml elementtree

我正在创建一个xml文件。我已经完成了根元素创建,并且能够定义xml声明。但是我需要创建一个花药标签,看起来像

<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:TalendProperties="http://www.talend.org/properties">
# i am unable to replicate the above

### some subelements..
</xmi:XMI>

我已经添加了xmlns URI,但是无法获取xmi:version =“ 2.0”。

我对XML不熟悉,因此感到困惑,请阅读有关名称空间及其全部内容的知识,而不必完全理解它。有人可以教我如何做或分享相关的网络链接吗?那会很有帮助。因为我在Internet上发现了大多数XML解析的内容,但是在XML生成方面却很少。

  xmlns_uris_dict = {'xmi':'http://..', 'subprocess':'http://xyz...'}
  root = ET.Element("talendfile:ProcessType")
  ET.register_namespace('xmi', 'version="2.0"') # This part gives a wrong presentation.
  # i am able to add URIs here
  for prefix, uri in xmlns_uris_dict.items():
    root.attrib['xmlns:' + prefix] = uri

2 个答案:

答案 0 :(得分:2)

创建命名空间元素和属性的一种好方法是使用QName

import xml.etree.ElementTree as ET

NS = "http://www.omg.org/XMI"
ET.register_namespace("xmi", NS)

# Create xmi:XMI element
root = ET.Element(ET.QName(NS, "XMI"))

# Add xmi:version attribute
root.set(ET.QName(NS, "version"), "2.0")

print(ET.tostring(root).decode())

结果:

<xmi:XMI xmlns:xmi="http://www.omg.org/XMI" xmi:version="2.0" />

register_namespace()确保序列化XML文档时使用xmi前缀(不是默认的ns0)。

答案 1 :(得分:0)

http://effbot.org/zone/element-namespaces.htm中的这两个函数说明了如何设置名称空间前缀。看看。

def fixup_element_prefixes(elem, uri_map, memo):
    def fixup(name):
        try:
            return memo[name]
        except KeyError:
            if name[0] != "{":
                return
            uri, tag = name[1:].split("}")
            if uri in uri_map:
                new_name = uri_map[uri] + ":" + tag
                memo[name] = new_name
                return new_name
    # fix element name
    name = fixup(elem.tag)
    if name:
        elem.tag = name
    # fix attribute names
    for key, value in elem.items():
        name = fixup(key)
        if name:
            elem.set(name, value)
            del elem.attrib[key]
package.json