見出し画像

XML読み書き

ELオブジェクトホームスタディコースを見て作ってみました
例題23のイメージだと最初にファイル読んで最後に書き込みだと思いますが、途中でも毎回更新するようにしちゃってますw
色々応用も効くのでちょっとしたメモリー代わりに読み書きするのには便利じゃないかと思います

XMLオブジェクト

ELは、XMLデータストラクチャーの作成、ファイルへの保存、ファイルからの読み取りを行う一連のオブジェクトをサポートしています
ELのXMLオブジェクトは、ノード、要素、属性、その他XMLデータの階層に関連するアイテムを含む、一般的に使用されているXMLドキュメントオブジェクトモデルをベースにしています
※ 詳しくはオブジェクトホームスタディコース127P以降とヘルプのXML関連のところを参照してください

XML(Extensible Markup Language)

開始タグと終了タグを使ってデータを階層構造化
ホームページ等のHTMLは指定タグで表示するが、
XMLは自由タグでデータが何であるかを定義する
例 <銘柄コード>9999</銘柄コード>
XMLファイル - XMLドキュメント - ルート(必ず1つ)その下に要素ノードとテキストノード
先程の例だと銘柄コードが要素ノードで9999がテキストノード

プログラム

{ -------------------------------------------------- }
	//このプログラムのXMLデータ構造
{ -------------------------------------------------- }
{	"XXXX.xml" 					( file )
		XMLdoc 					( Document )
			"XMLdata" 			( root )	宣言はルートもXmlElementとして定義するみたい
				"symbol" 		( Element1 )
					"code" 		( Element2 )
					"date" 		( Element2 )
					"open" 		( Element2 )
					"low" 		( Element2 )
					"high" 		( Element2 )
					"close" 	( Element2 )
					"volume"	( Element2 )		 }
{ -------------------------------------------------- }
	//宣言処理
{ -------------------------------------------------- }	//クラス宣言
using elsystem;																								//tsdataクラスによって使用される基本クラスと、その他一般的なelsystemクラス
using elsystem.xml;																							//XMLファイル内のデータ管理に使用される基本クラス
vars:		{ 変数宣言 }
	XmlDocument XMLdoc( null ),																				//XMLドキュメント
	XmlElement XMLroot( null ),																				//XMLルート
	XmlElement XMLelm1( null ),																				//XML要素階層1
	XmlElement XMLelm2( null ),																				//XML要素階層2
	XMLNodeList XMLnList( null ),																			//XMLノードリスト
	XmlNode XMLeNode( null ),																				//XML要素ノード
	bool filefound( false );																				//XMLファイル存在確認用 false:有 true:無
input:		{ 入力変数宣言 }
	string xmlFileName("C:\Program Files (x86)\TradeStation 9.5\japan-all-stock-financial-XXXX.xml");		//任意の場所、ファイル名でOK
{ -------------------------------------------------- }
	//初期処理	※ 検証する時に、プロパティでイニシャライズイベントに設定
{ -------------------------------------------------- }
method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args )		{インジケータ適用時、トレステ開始時}
begin
	XMLdoc = new xmldocument;																				//クラスの新規インスタンスを初期化
	//ファイル存在確認
	filefound = false;																						//XMLファイル存在確認初期設定 false:有 true:無
	try
		XMLdoc.Load( xmlFileName );																			//XMLファイル読み込み
	catch( elsystem.io.filenotfoundexception ex )
		filefound = true;																					//ファイルが見つからない場合 true
	end;
	//ファイルがない場合作成
	if filefound = true then begin
		Condition1 = true;																					//ファイル存在無: true
		XMLroot = XMLdoc.CreateElement( "XMLdata" );														//rootにXMLdata要素を作成
		XMLdoc.AppendChild( XMLroot );																		//Documentにrootを追加
		SaveXML();																							//XMLファイル書き込み処理
	end else begin
		Condition1 = false;																					//ファイル存在有: false
		XMLroot = XMLdoc.DocumentElement;																	//XMLドキュメントのルート要素を取得
	end;
end;
{ -------------------------------------------------- }
	//終了処理	※ 検証する時に、プロパティでアンイニシャライズイベントに設定
{ -------------------------------------------------- }
method void AnalysisTechnique_UnInitialized( elsystem.Object sender,elsystem.UnInitializedEventArgs args )	{インジケータ更新・削除時、トレステ終了時}
vars:
	int counter;																							//XMLファイルデータ作成管理用
begin
	XMLnList = XMLroot.GetElementsByTagName( "symbol" );													//指定要素名 symbol と一致する全ての子孫要素リストを含むXMLノードリストを返します
	Condition1 = false;																						//symbol存在有: false
	for counter = 0 to XMLnList.count - 1 begin
		if XMLnList.ItemOf[counter].Item["code"].innertext = symbol then begin								//存在有りの時XMLファイル更新
			SaveXML();																						//XMLファイル書き込み処理
		end;
	end;
end;
{ -------------------------------------------------- }
	//XMLファイル読み込み処理
{ -------------------------------------------------- }
method void ReadXML()
vars:
	int counter,																							//XMLファイルデータ作成管理用
	int number;																								//XMLファイルデータ作成管理用
begin
	XMLnList = XMLroot.GetElementsByTagName( "symbol" );													//指定要素名 symbol と一致する全ての子孫要素リストを含むXMLノードリストを返します
	//symbol存在確認
	number = - 1;																							//要素№初期設定
	for counter = 0 to XMLnList.count - 1 begin
		if XMLnList.ItemOf[counter].Item["code"].innertext = symbol then number = counter;					//存在有りの時要素№セット
	end;

	if number = - 1 then begin
		Condition1 = true;																					//symbol存在無: true
		XMLeNode = XMLelm1;																					//ノードにシンボル代入
	end else begin
		Condition1 = false;																					//symbol存在有: false
		XMLeNode = XMLnList.ItemOf[number];																	//ノードリストの要素№セット
	end;
		SaveXML();																							//XMLファイル書き込み処理
end;
{ -------------------------------------------------- }
	//XMLファイル書き込み処理
{ -------------------------------------------------- }
method void SaveXML()
begin
	//<symbol>
		XMLelm1 = XMLdoc.CreateElement( "symbol" );
		//<code>
		XMLelm2 = XMLdoc.CreateElement( "code" );
		XMLelm2.innertext = symbol;
	if Condition1 then begin																				//存在無しの時追加
		XMLelm1.AppendChild( XMLelm2 );
		//<datetime>
		XMLelm2 = XMLdoc.CreateElement( "datetime" );
		XMLelm2.innertext = " ";
		XMLelm1.AppendChild( XMLelm2 );
		//<open>
		XMLelm2 = XMLdoc.CreateElement( "open" );
		XMLelm2.innertext = " ";
		XMLelm1.AppendChild( XMLelm2 );
		//<low>
		XMLelm2 = XMLdoc.CreateElement( "low" );
		XMLelm2.innertext = " ";
		XMLelm1.AppendChild( XMLelm2 );
		//<high>
		XMLelm2 = XMLdoc.CreateElement( "high" );
		XMLelm2.innertext = " ";
		XMLelm1.AppendChild( XMLelm2 );
		//<close>
		XMLelm2 = XMLdoc.CreateElement( "close" );
		XMLelm2.innertext = " ";
		XMLelm1.AppendChild( XMLelm2 );
		//<volume>
		XMLelm2 = XMLdoc.CreateElement( "volume" );
		XMLelm2.innertext = " ";
		XMLelm1.AppendChild( XMLelm2 );
	//</symbol>
		XMLroot.AppendChild( XMLelm1 );
	end else begin																							//存在有りの時更新
		//<datetime>
		XMLeNode.Item["datetime"].InnerText = Datetime.Now.Format( "%Y/%m/%d %H:%M:%S" );
		//<open><low><high><close><volume>
		XMLeNode.Item["open"].InnerText = open.ToString();
		XMLeNode.Item["low"].InnerText = low.ToString();
		XMLeNode.Item["high"].InnerText = high.ToString();
		XMLeNode.Item["close"].InnerText = close.ToString();
		XMLeNode.Item["volume"].InnerText = volume.ToString();
	end;
	XMLdoc.Save( xmlFileName );																				//XMLファイル書き込み
end;
{ -------------------------------------------------- }
	//XMLファイル表示処理
{ -------------------------------------------------- }
Method void PlotValues()
begin
	ReadXML();																								//XMLファイル読み込み処理
	if Condition1 = false then begin 																		//symbol存在有: false
		plot1( XMLeNode.Item["code"].Innertext,"Symbol" );
		plot2( XMLeNode.Item["datetime"].Innertext,"DateTime" );
		plot3( int.Parse( XMLeNode.Item["open"].Innertext ),"open" );
		plot4( int.Parse( XMLeNode.Item["low"].Innertext ),"low" );
		plot5( int.Parse( XMLeNode.Item["high"].Innertext ),"high" );
		plot6( int.Parse( XMLeNode.Item["close"].Innertext ),"close" );
		plot7( int.Parse( XMLeNode.Item["volume"].Innertext ),"volume" );
	end;
end;
{ -------------------------------------------------- }
PlotValues();																								//表示処理

サポートされると喜んでアイスを買っちゃいます!٩(๑❛ᴗ❛๑)۶