AIで選択肢マスタXMLを作る

Questetra BPM Suite のワークフローアプリでは、選択肢の一覧を「選択肢マスタXML」としてアップロードし、複数のプルダウンやラジオボタンで共用できます。都道府県や郵便番号のように件数の多いリストや、複数アプリで使い回したいリストを一元管理するのに便利な仕組みです。

選択肢マスタXMLの作り方は 選択肢マスタXMLの作成方法 にまとまっています(テキストエディタ/モデラ/[選択肢マスタ更新]/外部連携など)。本記事は、その中の一つ AI(ChatGPT / Claude など)を使う方法 を詳しく解説します。

「手元にある雑多なデータから正しい形式のXMLを作る」「公式データを定期的にXML化する」といった作業は、AIが得意とするところです。この記事では、その使い方を 2つの経路 に分けて解説します。

目次

選択肢マスタXMLの形式(おさらい)

選択肢マスタXMLは、ルート要素 items の下に、選択肢ごとの item 要素を並べたシンプルな構造です。各 item は value(選択肢ID)と display(表示ラベル)の2属性のみを持ちます。

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item value="1" display="北海道" />
  <item value="2" display="青森県" />
</items>

文字コードは UTF-8 にしてください。属性の詳しい仕様は 選択肢 XML 書式(R3190) を参照してください。

作成前に知っておきたい制約・落とし穴

AI に作らせる/作った後の検証で、特につまずきやすいのが次の点です。AI へのプロンプトにもこれらを条件として盛り込んでおくと、手戻りが減ります。

  • XMLエスケープはプロンプトに明記する。 & < > " ' などの特殊文字は実体参照でのエスケープが必要です。AI は通常この変換を心得ていますが、件数の多い出力では途中で取りこぼすことがあるため、プロンプトに条件として書いておくと確実です。エスケープ漏れがあると、アップロード時に「不正な XML ファイルです。選択肢マスタの XML 形式を確認してください。」というエラーになります(書式の詳細は R3190 参照)。
  • value は一意にする。 同じIDが重複していると、最初に現れた1件だけが読み込まれ、2件目以降は無視されます。
  • 不可視文字を混入させない。 value にタブなどの不可視文字や前後の余分な空白が紛れ込むと、アップロード時に半角スペースへの置換・除去(正規化)が行われます。その結果、登録済みデータの値と一致しなくなり、「(削除)」と表示される原因になります。表計算ソフトからのコピペで混入しやすいので注意してください。
  • 半角カナは避けます。 Unicode 上は使えますが、表示フォントや環境によっては字形が崩れたり、全角・半角が混在して選択・検索がしづらくなります。全角に統一しておくのが無難です。
  • アップロードできるファイルサイズの上限は 20MB、選択肢数の上限は 15万件。 選択肢ID・表示ラベルはそれぞれ 1000 文字以内です。モデラ上で直接入力する場合の件数上限(1000 件)を大きく超える、大規模なマスタの受け皿になります。

アップロード先

作成した XML を どこに登録するか は、作り方に関係なく共通の話です。複数のアプリで共有するなら システム設定の[アプリ共有アドオン](システム管理権限)、1つのアプリ内で使うなら各アプリの[アドオン](アプリ管理権限)に登録します。使い分け・必要権限・更新の作法などの詳細は、選択肢マスタXMLの作成方法 を参照してください。

経路A:AI に XML を直接作らせる

向いているデータ: 商品コード、取引先名、部門一覧、独自の分類コードなど「その組織にしかない」中小規模のデータ。

手元にある表・箇条書き・CSVの断片といった雑なデータをそのまま AI に貼り付け、確定形式のXMLに変換させます。組織固有のデータは公式ソースが存在しないため、AI に「値そのもの」を渡して整形だけ任せるこの経路が適しています。

プロンプトのテンプレート例

次のデータを Questetra の選択肢マスタXMLに変換してください。

条件:
- ルート要素は items、各行は <item value="…" display="…" /> の形式
- 1行目に <?xml version="1.0" encoding="UTF-8"?> を入れる
- & < > " ' の5文字は必ず実体参照でエスケープする
- value は一意にする
- 半角カナは使わない
- 余計な説明は付けず、コピーしやすいコードブロック(件数が多ければ、保存できるファイル)として XML を出力する

データ:
1, あおばら工業株式会社
2, いなほファクトリー株式会社
3, うらなみシステム株式会社
4, えがらしテクノ株式会社

期待される出力:

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item value="1" display="あおばら工業株式会社" />
  <item value="2" display="いなほファクトリー株式会社" />
  <item value="3" display="うらなみシステム株式会社" />
  <item value="4" display="えがらしテクノ株式会社" />
</items>

完全性の注意

件数が多いと、チャットに直接出力させたときに AI が途中で打ち切ってしまうことがあります。ある程度の量になるなら、はじめから ダウンロードできるファイルとして全件を出力させる のが確実です。チャット欄の途中切れを避けられ、そのままアップロードにも使えます。

そのうえで、AI 自身に件数を数えさせて突き合わせ ましょう。生成後に、こう尋ねます。

出力した <item> は何件ですか?入力データは何件でしたか?

両者を数えて欠落の有無を報告してくれます。件数が合わなければ、途中から継ぎ足すのではなく 全件そろった完全版を作り直させます

入力は◯件ありました。抜けている選択肢を特定し、
全◯件そろった完全版をファイルで出力し直してください。

経路B:AI に「変換プログラム」を作らせる

向いているデータ: 件数が多いデータや、郵便番号・市区町村コード・全国地方公共団体コードのように公式に配布され、定期的に更新されるデータ。

経路Aのように AI に XML を直接書き出させると、大量データでは途中打ち切りや ハルシネーション(幻覚:誤った値の生成) が起きやすくなります。そこでこの経路では、XML そのものではなく 「変換プログラム」を AI に書かせ、その実行結果の XML とあわせて受け取ります

やり方は経路Aと同じで、変換したいデータ(CSV や zip などのファイル)を AI に渡します。そのうえで「変換プログラムと、実行結果の XML の両方を出して」と頼むだけです。ポイントは、AI に一件ずつ書かせるのではなく、処理そのものをプログラムに任せる こと。数万件でも取りこぼさず、しかもそのプログラムが再利用・検証できる成果物として手元に残ります。

依頼例

日本郵便の郵便番号データ(utf_ken_all.zip)を、Questetra の選択肢マスタXMLに変換したいです。
Python スクリプトを作成し、それを使用して変換してください。

- ルート要素は items、各選択肢は <item value="…" display="…" /> の形式
- 1行目に <?xml version="1.0" encoding="UTF-8"?> を入れる
- value に郵便番号、display に住所(都道府県+市区町村+町域)
- & < > " ' はエスケープ、value は一意
- 作成したスクリプトと、変換結果の options.xml(ダウンロードできる形)の
  両方を出してください

XML の形(items / item)は Questetra 固有なので、必ず指定してください。指定しないと <options><option> のような別の形で出力されてしまいます。一方、渡したファイルの文字コードや区切り文字などは AI 側が判断するので、そこまで細かく書く必要はありません。

出力例(生成されるスクリプト)

AI が返してくるスクリプトは、たとえば次のようになります。

import csv, io, zipfile

def esc(s):
    return (s.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
            .replace('"', "&quot;").replace("'", "&apos;"))

seen = set()
with zipfile.ZipFile("utf_ken_all.zip") as z:
    name = next(n for n in z.namelist() if n.upper().endswith(".CSV"))
    with z.open(name) as f, open("options.xml", "w", encoding="utf-8") as out:
        out.write('<?xml version="1.0" encoding="UTF-8"?>' + chr(10) + '<items>' + chr(10))
        for row in csv.reader(io.TextIOWrapper(f, encoding="utf-8-sig")):
            value = row[2]
            display = row[6] + row[7] + row[8]
            if value in seen:
                continue
            seen.add(value)
            out.write('  <item value="' + esc(value) + '" display="' + esc(display) + '" />' + chr(10))
        out.write('</items>' + chr(10))

print(len(seen), '件を出力しました')

エスケープや重複除去、件数の出力までスクリプト側で処理させるのがポイントです。最後に件数を出力させておけば、経路Aの「完全性の注意」と同じく突き合わせもできます。

さらに進める:スクリプトを再利用して更新を自動化する

作らせたスクリプトは(例えば convert.py として)取っておけば、データが更新されても再実行するだけ で最新の XML になります。

ダウンロードまで自動化するなら、2 通りあります。ひとつは スクリプトの外側で取得する 方法。curl などで最新の zip を落としてから、スクリプトに処理させます。取得と変換を分けられるので手順を把握しやすく、更新時は次の 2 行を実行するだけです。

curl -O https://www.post.japanpost.jp/service/search/zipcode/download/utf/zip/utf_ken_all.zip
python3 convert.py

もうひとつは スクリプト自身にダウンロードさせる 方法。先ほどのスクリプトを次のように改良させます。

上のスクリプトを、日本郵便の公式配布ページから utf_ken_all.zip を
ダウンロードするところから始めるように改良してください。
(例: https://www.post.japanpost.jp/service/search/zipcode/download/utf/zip/utf_ken_all.zip
 URL が変わっている場合は公式配布ページで最新を確認してください)
取得 → 解凍 → XML 変換までを一度の実行で完結させてください。

こうしておけば、実行するだけで取得から変換まで終わり、更新作業をほぼ自動化できます。値は毎回、公式ソースからそのまま取り込まれるので、ハルシネーションも入り込みません。

共通の締め:必ずアップロードして検証する

どちらの経路でも、生成したXMLは 必ず実際にアップロードして動作を確認 してください。もしアップロード時にエラーが出た場合、その原因の大半は エスケープ漏れ です。

エラーが出たときは、その症状をそのまま AI に伝えて修正させるのが手早い方法です。たとえば次のように依頼します。

アップロードしたら「不正な XML ファイルです。選択肢マスタの XML 形式を
確認してください。」というエラーになりました。
未エスケープの特殊文字(& < > " ')が残っていないかを点検し、
修正版のXMLだけを返してください。

また、サイズの大きいファイルは無料トライアル環境では扱えない場合があります。大規模マスタを試す際はご留意ください。

参考リンク

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む