當前位置: 首頁 >
發布日期:2022-04-26 點擊率:78
關鍵詞: 紫金橋軟件 讀寫XML文件 XML
摘要:XML又名“可擴展標記語言”,它提供統一的方法來描述和交換獨立于應用程序或供應商的結構化數據。這種統一性使得不同的軟件之間擁有一座通訊橋梁。XML廣泛應用于自動控制領域,因此在使用不同編程語言、組態工具時經常需要解析XML格式文件。本文講述如何使用紫金橋軟件來讀取XML文件。
一、概述
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-8、GBK、ANSI編碼格式。無法識別Unicode、Unicode 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、腳本邏輯
l “讀取”按鈕中的腳本如下:
//載入文件:
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
l 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結點信息。
l 進入窗口腳本:
OpenChild("win_nodeProperty");//打開屬性信息窗口
l 樹形控件腳本:
打開樹形控件屬性畫面,點擊“全局腳本”按鈕,在彈出的畫面中選擇“單擊腳本”,添加如下代碼:
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
<span style="font-style:italic;font-family:
下一篇: PLC、DCS、FCS三大控
上一篇: 索爾維全系列Solef?PV