XScript マニュアル · Chapter 35

XML オブジェクト — XML ドキュメント処理

スクリプトでキーワード XML を通じてアクセスする XML ユーティリティ。1 プロセスで 複数の XML 文書 を名前で識別し、ノードと属性は path 表記で扱います。

概念説明
xmlName文書識別子("recipe""settings" 等)
pathノード位置 — "/root/items/item"(XPath 風)
attributeName属性名(任意)— 空ならノードのテキスト値
結果 / エラー全呼出が内部フラグを更新 — GetResult / GetErrorMessage

基本フロー

// 1) 空の文書
XML.Create("recipe");
 
// 2) ノード追加 + 値設定
XML.AddNode("recipe", "/root", "");                 // <root/>
XML.SetString ("recipe", "/root/title",  "AlignRecipe");
XML.SetInteger("recipe", "/root/version", 2);
XML.SetDouble ("recipe", "/root/exposure_ms", 18.5);
XML.SetBool   ("recipe", "/root/use_filter",  true);
 
// 3) 保存
XML.Save("recipe", "D:/Recipes/align.xml");
 
// 4) 不要になったら削除
XML.Remove("recipe");

文書ライフサイクル

XML.Create("doc");                              // 空文書
XML.Parse ("doc", "<root><a>1</a></root>");     // 文字列パース
XML.Load  ("doc", "D:/Settings/sys.xml");       // ファイルロード
XML.Save  ("doc", "D:/Settings/sys.xml");       // ファイル保存
 
if( XML.Contains("doc") )  XML.Remove("doc");
XML.RemoveAll();

ノード追加 — AddNode / AddNodeCDATA

XML.AddNode("doc", "/root/items/item", "auto");
// <root><items><item>auto</item></items></root>
//   親 path が無ければ自動作成。
 
// CDATA で包む必要があるテキスト(HTML・複数行・< > & を含むなど)
XML.AddNodeCDATA("doc", "/root/desc", "<b>hello</b>\nworld");

同じ path を 2 回呼ぶ とノードが 1 つ追加され、兄弟として積まれます。


ノードのテキスト値を書く — SetXxx

XML.SetString ("doc", "/root/name",     "Alice");
XML.SetInteger("doc", "/root/age",      30);
XML.SetDouble ("doc", "/root/weight",   62.4);
XML.SetBool   ("doc", "/root/active",   true);
 
// CDATA で包んで保存
XML.SetStringCDATA("doc", "/root/desc", "<html>...</html>");

ノードが無ければ 自動作成。同じ path に複数の兄弟がある場合、最初のノードの値が更新されます。


属性を書く — SetXxxAttribute

XML.SetStringAttribute ("doc", "/root/name", "lang", "ja");
XML.SetIntegerAttribute("doc", "/root/age",  "ver", 2);
XML.SetDoubleAttribute ("doc", "/root/weight", "kg", 0.001);
XML.SetBoolAttribute   ("doc", "/root/active", "auto", true);

読み取り — GetXxx

// ノードのテキスト値
string s = XML.GetString ("doc", "/root/name");
int    i = XML.GetInteger("doc", "/root/age");
double d = XML.GetDouble ("doc", "/root/weight");
bool   b = XML.GetBool   ("doc", "/root/active");
 
// 属性読み取り(第 3 引数)
string lang = XML.GetString ("doc", "/root/name", "lang");
int    ver  = XML.GetInteger("doc", "/root/age",  "ver");

第 3 引数(attributeName)が空ならノードテキスト、埋まっていれば該当属性の値を返します。


子ノード数 — GetCount

// /root/items 配下の子ノード総数
int total = XML.GetCount("doc", "/root/items");
 
// /root/items 配下の 'item' 名の子ノード数
int items = XML.GetCount("doc", "/root/items", "item");
 
for(i, 0, items - 1)
{
    string name = XML.GetString("doc", $"/root/items/item[{i}]/name");
    // ...
}

結果 / エラー処理

XML.ResetResult("doc");
XML.SetInteger("doc", "/root/missing/path", 1);
if( XML.GetResult("doc") == false )
{
    LogError($"XML write failed : {XML.GetErrorMessage("doc")}");
}

複数の SetXxx 呼出のあとに一括検証パターンが綺麗。


よく使うパターン

システム設定の保存 / 読込

FUNCTION SaveSettings(string path)
{
    XML.Create("set");
    XML.AddNode("set", "/Settings", "");
    XML.SetInteger("set", "/Settings/Light",    Data::Light);
    XML.SetDouble ("set", "/Settings/Exposure", Data::Exposure);
    XML.SetBool   ("set", "/Settings/UseAuto",  Data::UseAuto);
 
    XML.Save("set", path);
    XML.Remove("set");
}
 
FUNCTION LoadSettings(string path)
{
    XML.Load("set", path);
    if( XML.GetResult("set") == false )
    {
        ShowMessage(EB_Ok, XML.GetErrorMessage("set"));
        return false;
    }
 
    Data::Light    = XML.GetInteger("set", "/Settings/Light");
    Data::Exposure = XML.GetDouble ("set", "/Settings/Exposure");
    Data::UseAuto  = XML.GetBool   ("set", "/Settings/UseAuto");
 
    XML.Remove("set");
    return true;
}

外部 XML のパース

XML.Load("rep", "D:/Reports/lot_001.xml");
 
int n = XML.GetCount("rep", "/Report/Items", "Item");
for(i, 0, n - 1)
{
    string name  = XML.GetString ("rep", $"/Report/Items/Item[{i}]/Name");
    int    count = XML.GetInteger("rep", $"/Report/Items/Item[{i}]/Count");
    Log($"#{i} {name} = {count}");
}
XML.Remove("rep");

関数一覧

分類関数
ライフサイクルCreate · Parse · Load · Save · Remove · RemoveAll · Contains
結果GetResult · GetErrorMessage · ResetResult
ノードAddNode · AddNodeCDATA · GetCount
テキスト書きSetString · SetInteger · SetDouble · SetBool · SetStringCDATA
属性書きSetStringAttribute · SetIntegerAttribute · SetDoubleAttribute · SetBoolAttribute
読みGetString · GetInteger · GetDouble · GetBool(path + 任意の attributeName)