You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入自制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:26:02