导入自制XMI至Enterprise Architect时根包缺失错误排查求助
解决Enterprise Architect导入自制XMI时的"Root package not found"错误
我正在编写Python脚本,生成XMI文件用于在Enterprise Architect中创建关联问卷的Viewpoint。当前仅实现了基础功能,但导入EA时始终报错:
Error: Root package not found in : XMI.content/UML:Model/UML:Namespace.ownedElement/UML:Package
原代码
import tkinter as tk from tkinter import ttk import xml.etree.ElementTree as ET from PIL import Image, ImageTk from pathlib import Path import uuid # Funktion zum Erstellen des XMI-Dokuments für Enterprise Architect def create_xmi(viewpoint_name): # Namespace-Definitionen ns = { 'xmi': "http://www.omg.org/spec/XMI/2.1", 'uml': "http://www.eclipse.org/uml2/3.0.0/UML" } ET.register_namespace("xmi", ns['xmi']) ET.register_namespace("uml", ns['uml']) # Erstellen des XMI-Baums xmi = ET.Element("xmi:XMI", { "xmlns:xmi": ns['xmi'], "xmlns:uml": ns['uml'], "xmi:version": "1.1" }) documentation = ET.SubElement(xmi, "xmi:Documentation", { "xmi:Exporter": "Enterprise Architect", "xmi:ExporterVersion": "2.5" }) # Modell erstellen model_id = str(uuid.uuid4()) model = ET.SubElement(xmi, "uml:Mod el", { "xmi:id": model_id, "name": "NaFv4_Model" }) # Root-Package erstellen root_package_id = str(uuid.uuid4()) root_package = ET.SubElement(model, "packagedElement", { "xmi:type": "uml:Package", "xmi:id": root_package_id, "name": "RootPackage" }) # Paket erstellen package_id = str(uuid.uuid4()) package = ET.SubElement(root_package, "packagedElement", { "xmi:type": "uml:Package", "xmi:id": package_id, "name": "ExamplePackage" }) # Viewpoint erstellen viewpoint_id = str(uuid.uuid4()) viewpoint = ET.SubElement(package, "packagedElement", { "xmi:type": "uml:Class", "xmi:id": viewpoint_id, "name": viewpoint_name, "stereotype": "Viewpoint" }) # Diagramm erstellen diagram_id = str(uuid.uuid4()) diagram = ET.SubElement(package, "ownedDiagram", { "xmi:type": "uml:Diagram", "xmi:id": diagram_id, "name": f"{viewpoint_name}_Diagram", "diagramType": "ClassDiagram" }) # Diagramm-Ebene erstellen diagram_element = ET.SubElement(diagram, "element", { "subject": viewpoint_id, "presentation": "Class" }) # Erstellen des Ordners, falls er nicht existiert output_dir = Path("output") output_dir.mkdir(parents=True, exist_ok=True) # Speichern der XMI-Datei im Ordner xmi_file_path = output_dir / f"{viewpoint_name}_viewpoint.xmi" tree = ET.ElementTree(xmi) tree.write(xmi_file_path, encoding='utf-8', xml_declaration=True) print(f"XMI-Dokument erstellt: {xmi_file_path}") # GUI erstellen def create_gui(): # GUI erstellen root = tk.Tk() root.title("NAFv4 Viewpoint erstellen") # Hintergrundbild laden background_image = Image.open("bundeswehr-corporate-design.jpg") # Größe des Bildes erhalten width, height = background_image.size # Hauptfenstergröße entsprechend der Bildgröße festlegen root.geometry(f"{width}x{height}") # Hintergrundbild in Label einfügen background_photo = ImageTk.PhotoImage(background_image) background_label = tk.Label(root, image=background_photo) background_label.place(x=0, y=0, relwidth=1, relheight=1) # Label und Entry für den Viewpoint-Namen viewpoint_label = ttk.Label(root, text="Name des Viewpoints:") viewpoint_label.grid(row=0, column=0, padx=10, pady=5) viewpoint_entry = ttk.Entry(root) viewpoint_entry.grid(row=0, column=1, padx=10, pady=5) # Button zum Erstellen des XMI-Dokuments create_xmi_button = ttk.Button(root, text="XMI erstellen", command=lambda: create_xmi(viewpoint_entry.get())) create_xmi_button.grid(row=1, column=0, columnspan=2, padx=10, pady=5) root.mainloop() # Programm starten if __name__ == "__main__": create_gui()
需要修改的关键部分
修复Model元素的拼写错误
原代码中uml:Mod el包含大量多余空格,导致EA无法识别正确的Model节点,这是报错的核心原因。修改为:model = ET.SubElement(xmi, "uml:Model", { "xmi:id": model_id, "name": "NaFv4_Model" })调整Root Package的命名与层级(可选但推荐)
EA默认的Root Package通常命名为Model,且需要确保它是Model节点的直接子元素(原代码逻辑正确,但命名更贴合规范可提升兼容性):root_package = ET.SubElement(model, "packagedElement", { "xmi:type": "uml:Package", "xmi:id": root_package_id, "name": "Model" })修正Viewpoint的构造型引用方式
EA中不能直接通过stereotype属性标记元素,需要使用appliedStereotype关联构造型ID。如果EA中已内置"Viewpoint"构造型,可修改为:viewpoint = ET.SubElement(package, "packagedElement", { "xmi:type": "uml:Class", "xmi:id": viewpoint_id, "name": viewpoint_name, "appliedStereotype": "#Viewpoint" # 假设构造型ID为Viewpoint })如果是自定义构造型,需要在XMI中先定义该构造型。
修正Diagram元素结构
EA的XMI中,Diagram的展示元素需要用ownedPresentation而非element,修改为:diagram_element = ET.SubElement(diagram, "ownedPresentation", { "xmi:type": "uml:Shape", "subject": viewpoint_id, "type": "Class" })
内容的提问来源于stack exchange,提问作者Milan Gottelt
相关产品推荐
相关产品推荐

