當前位置:自動化網>紫金橋軟件技術有限公司門戶>應用案例>紫金橋軟件讀寫XML文件

          紫金橋軟件讀寫XML文件

          發布時間:2016-07-28 14:55   類型:應用案例   人瀏覽

          一、概述

          XML又名“可擴展標記語言”,它提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據。這種統一性使得不同的軟件之間擁有一座通訊橋梁。XML廣泛應用于自動控制領域,因此在使用不同編程語言、組態工具時經常需要解析XML格式文件。本文講述如何使用紫金橋軟件來讀取XML文件。

          二、ObXml組件簡介

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

          ObXml組件用于解析或生成XML文件。使用Load函數載入XML文件或直接創建XML文件后,所有關于文件的修改操作都是針對內存數據的修改,在使用Save函數或SaveAs函數之后才會將修改的結果保存至硬盤。

          每個XML結點以及結點屬性均對應一個整型標識號,標識號是在組件讀取XML(新建XML)后動態生成的,作為執行組件各種操作函數的參數以定位結點或結點屬性。因為標識號是動態生成的,并非XML文件自帶信息,每次使用組件打開(或新建)XML文件時同一結點的標識號可能會不同,因此它只能在運行時臨時獲取并使用,當組件關閉后,這些標識將失去意義。

              組件實現的功能:

              1)讀取已存在的XML文件,遍歷所有結點,讀寫結點名字、結點文本、結點屬性,讀寫聲明語句。

              2)創建新的XML文件并保存。

              注意事項:

              1)無法讀取或寫入XML文件中的注釋語句。

          2)能夠識別UTF-8GBKANSI編碼格式。無法識別UnicodeUnicode big endian編碼格式。

          三、工程示例

          制作一個可以讀取XML文件的工程,主畫面包含兩部分:左側為一個樹形控件,用于顯示所有XML結點;右側為一個結點屬性窗口,當點擊樹形控件上的不同結點時,屬性窗口顯示對應結點的所有信息:結點名、結點文本、結點標識、結點路徑、屬性列表,其中屬性列表包含每個屬性的屬性名、屬性文本、屬性標識。效果圖如下:

          1引入組件

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

          在組態界面打開子圖選擇畫面,在左側選擇“windows控件”一項,如下圖所示:

          點擊右上方菜單“文件->安裝子圖庫”,如下圖所示:

          在彈出的文件選擇對話框中找到紫金橋安裝目錄下的Wizard文件夾,并選擇“ObXml.dll”文件,然后點擊“打開”按鈕。

          然后在彈出的畫面中輸入名字“XML”,然后點擊“確定”按鈕,如下圖:

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

          2前期準備

          創建一個窗口,命名為“win_main”。創建內部對象:

          創建一個XML組件,命名為“w_xml”。

          創建一個按鈕,文本改成“讀取”。

          創建一個文本框,命名為“w_editFileName”。

          創建一個樹形控件,命名為“w_tree”。

          完成后的畫面:

          創建窗口,命名為“win_nodeProperty”,用于顯示結點信息,其內部對象如下:

          創建四個文本框,分別命名為“w_edtName”、“w_edtKey”、“w_edtText”、“w_edtPath”。

          創建一個自由報表,命名為“w_frptAttrib”,設置為3列,列名為“屬性名”、“屬性文本”、“屬性key”。若干靜態文本,完成后的畫面如下圖所示:

          3腳本邏輯

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

          //載入文件:

          if !#win_xml.Load(#w_edtFileName.Text) then

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

          return;

          endif

           

          //XML信息顯示在樹形控件上:

          int nRoot = #win_xml.GetRootNode();

          string strKey = "";

           

          #win_tree.DeleteAllNode();

          if nRoot>0 then

          strKey = #win_tree.AddSubItemTail("","");

          fun_ToTree(nRoot,strKey);

          endif

          fun_ToTree函數的聲明如下

          fun_ToTree函數體如下:

          //Function name: fun_ToTree

          int nNodeTemp = 0;

          string strNodeTemp = "";

           

          //設置樹控件結點文本:

          #win_tree.SetNodeTxt(strFatherKey, #win_xml.GetNodeName(nNode) + " (" + fun_GetAttribInfo(nNode) + ")");

          //XML結點標識保存在對應的樹控件結點中:

          #win_tree.SetNodeData(strFatherKey,nNode);

           

          nNodeTemp = #win_xml.GetFirstChildNode(nNode);

          while nNodeTemp>0 do

          //在樹控件上增加一個子結點:

          strNodeTemp = #win_tree.AddSubItemTail(strFatherKey,"");

          //遞歸調用:

          fun_ToTree(nNodeTemp,strNodeTemp);

          nNodeTemp = #win_xml.GetNextNode(nNodeTemp);

          endwhile

          這個函數使用遞歸算法遍歷XML結點信息。

          進入窗口腳本:

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

          樹形控件腳本:

          打開樹形控件屬性畫面,點擊“全局腳本”按鈕,在彈出的畫面中選擇“單擊腳本”,添加如下代碼:

          fun_OnLbtnDown()

          fun_OnLbtnDown()函數體如下:

          int nData = -1;

          if #win_tree.GetCurSelNodeKey()<>"" then

          nData = #win_tree.GetCurSelNodeData();

          //刷新屬性信息窗口:

          #win_nodeProperty.fun_ShowProperty(#win_xml,nData);

          endif

          fun_ShowProperty函數聲明:

          fun_ShowProperty函數體:

          #w_edtKey.Val = nNode;

          #w_edtName.Text = #pXml.GetNodeName(nNode);

          #w_edtText.Text = #pXml.GetNodeText(nNode);

           

          string strPath = "";

          int nNodeTemp = 0;

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

           

          //向上遍歷生成本結點的路徑名:

          nNodeTemp = nNode;

          strPath = #pXml.GetNodeName(nNode);

          while nNodeTemp>0 do

          nNodeTemp = #pXml.GetParentNode(nNodeTemp);

          strPath = #pXml.GetNodeName(nNodeTemp) + strS + strPath;

          endwhile

          #w_edtPath.Text = strPath;

           

          //生成屬性報表:

          string strArrAttrinNames[];

          int i = 0;

           

          #w_frptAttrib.DelTailRow(#w_frptAttrib.RowCount());

          #pXml.GetAttibNames(nNode,strArrAttrinNames);

          #w_frptAttrib.AddRow(strArrAttrinNames.GetCount());

          for i=0 to strArrAttrinNames.GetCount()

          #w_frptAttrib.SetRowHeight(i+1,40);

          #w_frptAttrib.SetTxt(1,i+1,strArrAttrinNames[i]);

          #w_frptAttrib.SetTxt(2,i+1,#pXml.GetAttribTextEx(nNode,"",strArrAttrinNames[i]));

          #w_frptAttrib.SetVal(3,i+1,#pXml.GetAttrib(nNode,"",strArrAttrinNames[i]));

          next

          #w_frptAttrib.SetInputFmtEdit(1,1,#w_frptAttrib.ColCount(),#w_frptAttrib.RowCount(),4);

          其中fun_GetAttribInfo函數用于生成指定XML結點的屬性信息字符串,其函數聲明如下:

          fun_GetAttribInfo函數體如下:

          //Function name: fun_GetAttribInfo

          string strArrAttribNames[];

          int i = 0;

          string strText = "";

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

           

          if nNodeKey>0 then

          #win_xml.GetAttibNames(nNodeKey,strArrAttribNames);

          for i=0 to strArrAttribNames.GetCount()

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

          + strS + #win_xml.GetAttribTextEx(nNodeKey,"",strArrAttribNames[i]) + strS;

          next

          strText = StrTrimLeft(strText);

          endif

           

          RETURN strText;

          四、結語

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

          本文地址:http://m.xznet110.com/apply/d_1nuk7eevnrje1_1.html

          拷貝地址

          版權聲明:版權歸中國自動化網所有,轉載請注明出處!

          留言反饋
          • 評價:

          • 關于:

          • 聯系人:

          • 聯系電話:

          • 聯系郵箱:

          • 需求意向:

          • 驗證碼:

            看不清楚?

          X
          下載企業APP

          成為企業會員免費生成APP!

          主站蜘蛛池模板: 一级有奶水毛片免费看| 中文字幕无码无码专区| 电影天堂2018| 国产六月婷婷爱在线观看| 91www永久在线精品果冻传媒| 成人欧美一区二区三区黑人| 二级毛片在线播放| youjizz国产| 小明发布永久在线成人免费| 亚洲精品国产啊女成拍色拍| 色婷婷精品视频| 国产精品久久福利网站| yellow中文字幕在线高清| 欧美精品一区二区三区久久| 四虎国产欧美成人影院| 欧美亚洲国产第一页草草| 成人欧美日韩高清不卡| 亚洲AV无码乱码麻豆精品国产 | 欧洲肉欲K8播放毛片| 从镜子里看我怎么c你| 老头天天吃我奶躁我的视频| 国产成人久久精品一区二区三区 | 日本年轻的继坶中文字幕| 免费看片免费播放| 青娱乐在线视频播放| 国产精品三级在线观看无码| 99资源在线观看| 性高湖久久久久久久久aaaaa| 久久天堂AV综合合色蜜桃网| 欧美乱色理伦片| 亚洲福利在线视频| 韩国理伦大片三女教师| 国产综合色在线精品| gogo人体销魂baoyu231| 成人精品一区二区不卡视频| 亚洲欧洲高清有无| 男女真实无遮挡xx00动态图120秒 男女肉粗暴进来120秒动态图 | 猫咪AV成人永久网站在线观看| 国产最爽的乱淫视频国语对| 97人人模人人爽人人少妇| 日本伊人精品一区二区三区|