MaiML の4大セクション(Document, Protocol, Data, EventLog)を毎回ゼロから構築するのは、コード記述量が多く現実的ではありません。
実務における最も洗練されたワークフローは、「装置構成や実験手順をあらかじめ『プロトコル単体ファイル(テンプレート)』として定義しておき、日々の測定スクリプトはデータとログのみを注入して完全な MaiML をバッチ出力する」 という運用パターンです。
ProtocolFileRootType
MaiML 規格(JIS K 0200)では、測定データ(<data>)や実行ログ(<eventLog>)を含まない、装置構成と測定プロトコルのみを記述した単体仕様 ProtocolFileRootType が正式にサポートされています。
<!-- xsi:type に protocolFileRootType を指定 -->
<maiml xmlns="http://www.maiml.org/schemas"
xsi:type="protocolFileRootType"
version="1.0">
<document>...</document>
<protocol>...</protocol>
</maiml>
serialization.load("standard_protocol.maiml") により既存のプロトコルツリーを取得。IdFactory.from_existing_ids(loaded.ids) を使用して、テンプレート内で既に使われている xs:ID と衝突しない安全なID採番環境を即座に作成。materialTemplate や resultTemplate の ID を参照(ref)した DataType と EventLogType を構築。MaimlRootType(document, protocol, data, event_log) を組み立てて保存。# 1. テンプレート読み込み
loaded = serialization.load("standard_protocol.maiml")
# 2. 既存IDと衝突しないIDファクトリ
ids = IdFactory.from_existing_ids(loaded.ids)
# 3. テンプレートを参照するデータを作成
material = m.MaterialType(
id=ids.new_id("material"),
ref=loaded.root.protocol.material_templates[0].id,
content=m.GlobalObjectContent(uuid=ids.new_uuid(), name="Sample_01")
)
# 4. 完全な MaiML として保存
full_root = m.MaimlRootType(
document=loaded.root.document,
protocol=loaded.root.protocol,
data=data,
event_log=event_log
)
serialization.dump(full_root, "output.maiml", extra_namespaces=loaded.namespaces)