控制軟件

紫金橋軟件讀寫(xiě)XML文件

ainet.cn   2016年09月08日

  一、概述

  XML又名“可擴(kuò)展標(biāo)記語(yǔ)言”,它提供統(tǒng)一的方法來(lái)描述和交換獨(dú)立于應(yīng)用程序或供應(yīng)商的結(jié)構(gòu)化數(shù)據(jù)。這種統(tǒng)一性使得不同的軟件之間擁有一座通訊橋梁。XML廣泛應(yīng)用于自動(dòng)控制領(lǐng)域,因此在使用不同編程語(yǔ)言、組態(tài)工具時(shí)經(jīng)常需要解析XML格式文件。本文講述如何使用紫金橋軟件來(lái)讀取XML文件。

  二、ObXml組件簡(jiǎn)介

  在紫金橋軟件中,使用ObXml組件可以方便的讀寫(xiě)XML文件。

  ObXml組件用于解析或生成XML文件。使用Load函數(shù)載入XML文件或直接創(chuàng)建XML文件后,所有關(guān)于文件的修改操作都是針對(duì)內(nèi)存數(shù)據(jù)的修改,在使用Save函數(shù)或SaveAs函數(shù)之后才會(huì)將修改的結(jié)果保存至硬盤(pán)。

  每個(gè)XML結(jié)點(diǎn)以及結(jié)點(diǎn)屬性均對(duì)應(yīng)一個(gè)整型標(biāo)識(shí)號(hào),標(biāo)識(shí)號(hào)是在組件讀取XML(新建XML)后動(dòng)態(tài)生成的,作為執(zhí)行組件各種操作函數(shù)的參數(shù)以定位結(jié)點(diǎn)或結(jié)點(diǎn)屬性。因?yàn)闃?biāo)識(shí)號(hào)是動(dòng)態(tài)生成的,并非XML文件自帶信息,每次使用組件打開(kāi)(或新建)XML文件時(shí)同一結(jié)點(diǎn)的標(biāo)識(shí)號(hào)可能會(huì)不同,因此它只能在運(yùn)行時(shí)臨時(shí)獲取并使用,當(dāng)組件關(guān)閉后,這些標(biāo)識(shí)將失去意義。

  組件實(shí)現(xiàn)的功能:

  1)讀取已存在的XML文件,遍歷所有結(jié)點(diǎn),讀寫(xiě)結(jié)點(diǎn)名字、結(jié)點(diǎn)文本、結(jié)點(diǎn)屬性,讀寫(xiě)聲明語(yǔ)句。

  2)創(chuàng)建新的XML文件并保存。

  注意事項(xiàng):

  1)無(wú)法讀取或?qū)懭隭ML文件中的注釋語(yǔ)句。

  2)能夠識(shí)別UTF-8、GBK、ANSI編碼格式。無(wú)法識(shí)別Unicode、Unicode big endian編碼格式。

  三、工程示例

  制作一個(gè)可以讀取XML文件的工程,主畫(huà)面包含兩部分:左側(cè)為一個(gè)樹(shù)形控件,用于顯示所有XML結(jié)點(diǎn);右側(cè)為一個(gè)結(jié)點(diǎn)屬性窗口,當(dāng)點(diǎn)擊樹(shù)形控件上的不同結(jié)點(diǎn)時(shí),屬性窗口顯示對(duì)應(yīng)結(jié)點(diǎn)的所有信息:結(jié)點(diǎn)名、結(jié)點(diǎn)文本、結(jié)點(diǎn)標(biāo)識(shí)、結(jié)點(diǎn)路徑、屬性列表,其中屬性列表包含每個(gè)屬性的屬性名、屬性文本、屬性標(biāo)識(shí)。效果圖如下:

 

  1、引入組件

  如果在子圖中已存在該組件,可以忽略此步驟,直接進(jìn)入下一步。

  在組態(tài)界面打開(kāi)子圖選擇畫(huà)面,在左側(cè)選擇“windows控件”一項(xiàng),如下圖所示:

 

  點(diǎn)擊右上方菜單“文件->安裝子圖庫(kù)”,如下圖所示:

 

  在彈出的文件選擇對(duì)話(huà)框中找到紫金橋安裝目錄下的Wizard文件夾,并選擇“”文件,然后點(diǎn)擊“打開(kāi)”按鈕。

 

  然后在彈出的畫(huà)面中輸入名字“XML”,然后點(diǎn)擊“確定”按鈕,如下圖:

 

  這樣,XML組件就可以使用了。

  2、前期準(zhǔn)備

  創(chuàng)建一個(gè)窗口,命名為“win_main”。創(chuàng)建內(nèi)部對(duì)象:

  創(chuàng)建一個(gè)XML組件,命名為“w_xml”。

  創(chuàng)建一個(gè)按鈕,文本改成“讀取”。

  創(chuàng)建一個(gè)文本框,命名為“w_editFileName”。

  創(chuàng)建一個(gè)樹(shù)形控件,命名為“w_tree”。

  完成后的畫(huà)面:

 

  創(chuàng)建窗口,命名為“win_nodeProperty”,用于顯示結(jié)點(diǎn)信息,其內(nèi)部對(duì)象如下:

  創(chuàng)建四個(gè)文本框,分別命名為“w_edtName”、“w_edtKey”、“w_edtText”、“w_edtPath”。

  創(chuàng)建一個(gè)自由報(bào)表,命名為“w_frptAttrib”,設(shè)置為3列,列名為“屬性名”、“屬性文本”、“屬性key”。若干靜態(tài)文本,完成后的畫(huà)面如下圖所示:

 

  3、腳本邏輯

  “讀取”按鈕中的腳本如下:

  //載入文件:

  if !#(#) then

  MsgBox("讀取文件失敗!");

  return;

  endif

  //將XML信息顯示在樹(shù)形控件上:

  int nRoot = #tNode();

  string strKey = "";

  #AllNode();

  if nRoot>0 then

  strKey = #ItemTail("","");

  fun_ToTree(nRoot,strKey);

  endif

  fun_ToTree函數(shù)的聲明如下:

 

  fun_ToTree函數(shù)體如下:

  //Function name: fun_ToTree

  int nNodeTemp = 0;

  string strNodeTemp = "";

  //設(shè)置樹(shù)控件結(jié)點(diǎn)文本:

  #eTxt(strFatherKey, #eName(nNode) + " (" + fun_GetAttribInfo(nNode) + ")");

  //將XML結(jié)點(diǎn)標(biāo)識(shí)保存在對(duì)應(yīng)的樹(shù)控件結(jié)點(diǎn)中:

  #eData(strFatherKey,nNode);

  nNodeTemp = #stChildNode(nNode);

  while nNodeTemp>0 do

  //在樹(shù)控件上增加一個(gè)子結(jié)點(diǎn):

  strNodeTemp = #ItemTail(strFatherKey,"");

  //遞歸調(diào)用:

  fun_ToTree(nNodeTemp,strNodeTemp);

  nNodeTemp = #tNode(nNodeTemp);

  endwhile

  這個(gè)函數(shù)使用遞歸算法遍歷XML結(jié)點(diǎn)信息。

  進(jìn)入窗口腳本:

  OpenChild("win_nodeProperty");//打開(kāi)屬性信息窗口

  樹(shù)形控件腳本:

  打開(kāi)樹(shù)形控件屬性畫(huà)面,點(diǎn)擊“全局腳本”按鈕,在彈出的畫(huà)面中選擇“單擊腳本”,添加如下代碼:

  fun_OnLbtnDown()

  fun_OnLbtnDown()函數(shù)體如下:

  int nData = -1;

  if #SelNodeKey()<>"" then

  nData = #SelNodeData();

  //刷新屬性信息窗口:

  #_ShowProperty(#win_xml,nData);

  endif

  fun_ShowProperty函數(shù)聲明:

 

  fun_ShowProperty函數(shù)體:

  # = nNode;

  # = #eName(nNode);

  # = #eText(nNode);

  string strPath = "";

  int nNodeTemp = 0;

  string strS = AscToChar(47);//斜杠作為路徑分隔符

  //向上遍歷生成本結(jié)點(diǎn)的路徑名:

  nNodeTemp = nNode;

  strPath = #eName(nNode);

  while nNodeTemp>0 do

  nNodeTemp = #entNode(nNodeTemp);

  strPath = #eName(nNodeTemp) + strS + strPath;

  endwhile

  # = strPath;

  //生成屬性報(bào)表:

  string strArrAttrinNames[];

  int i = 0;

  #lRow(#nt());

  #ibNames(nNode,strArrAttrinNames);

  #(nt());

  for i=0 to nt()

  #Height(i+1,40);

  #(1,i+1,strArrAttrinNames[i]);

  #(2,i+1,#ribTextEx(nNode,"",strArrAttrinNames[i]));

  #(3,i+1,#rib(nNode,"",strArrAttrinNames[i]));

  next

  #utFmtEdit(1,1,#nt(),#nt(),4);

  其中fun_GetAttribInfo函數(shù)用于生成指定XML結(jié)點(diǎn)的屬性信息字符串,其函數(shù)聲明如下:

 

  fun_GetAttribInfo函數(shù)體如下:

  //Function name: fun_GetAttribInfo

  string strArrAttribNames[];

  int i = 0;

  string strText = "";

  string strS = AscToChar(34);//雙引號(hào)作為分隔符

  if nNodeKey>0 then

  #ibNames(nNodeKey,strArrAttribNames);

  for i=0 to nt()

  strText = strText + " " + strArrAttribNames[i] + "="

  + strS + #ribTextEx(nNodeKey,"",strArrAttribNames[i]) + strS;

  next

  strText = StrTrimLeft(strText);

  endif

  RETURN strText;

  四、結(jié)語(yǔ)

  這個(gè)示例演示了如何使用ObXml組件讀取XML文件信息,如果想修改XML文件則可以調(diào)用ObXml組件中的相應(yīng)函數(shù),例如:bool SetRoot(string name,string text)用于設(shè)置或新建根結(jié)點(diǎn);bool SetNodeName(int NodeKey,string NewName)用于設(shè)置結(jié)點(diǎn)名;bool SetAttrib(int NodeKey, string name, string Text)用于設(shè)置結(jié)點(diǎn)屬性;bool Save()用于保存文件。

(轉(zhuǎn)載)

標(biāo)簽:紫金橋軟件 我要反饋 
泰科電子ECK、ECP系列高壓直流接觸器白皮書(shū)下載
優(yōu)傲機(jī)器人下載中心
億萬(wàn)克
專(zhuān)題報(bào)道