Как добавить атрибут xmi: version = "2.0" к элементу - PullRequest
1 голос
/ 31 октября 2019

Я создаю 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>

Я закончил с добавлением URI xmlns, но не могу получить xmi: version = "2.0".

Я незнаком с XML, поэтому запутался, читал про пространство имен и все такое, не совсем разбираясь в этом. Может кто-нибудь показать мне, как это сделать или поделиться ссылкой на сайт. Это очень поможет. Потому что я нашел в Интернете в основном материал для разбора 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 ]

2 голосов
/ 03 ноября 2019

Хороший способ создания элементов и атрибутов в пространстве имен - использовать 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).

0 голосов
/ 31 октября 2019

Эти две функции из http://effbot.org/zone/element-namespaces.htm объясняют, как установить префиксы пространства имен. Посмотрите.

def set_prefixes(elem, prefix_map):

    # check if this is a tree wrapper
    if not ET.iselement(elem):
        elem = elem.getroot()

    # build uri map and add to root element
    uri_map = {}
    for prefix, uri in prefix_map.items():
        uri_map[uri] = prefix
        elem.set("xmlns:" + prefix, uri)

    # fixup all elements in the tree
    memo = {}
    for elem in elem.getiterator():
        fixup_element_prefixes(elem, uri_map, memo)
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]
...