首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
紫金桥软件读写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、脚本逻辑

  • “读取”按钮中的脚本如下

//载入文件:

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()用于保存文件。


 

状 态: 离线

公司简介
产品目录

公司名称: 紫金桥软件技术有限公司
联 系 人: 李磊
电  话: 0459-8151391-808
传  真: 0459-8151391-804
地  址: 大庆市高新区服务外包产业园C-1座817室
邮  编: 163316
主  页:
 
该厂商相关技术文摘:
跨平台实时数据库变量引用导航功能介绍
跨平台实时数据库 如何利用MODBUS仿真软件测试MODBUS驱动
紫金桥跨平台实时数据库如何实现多屏显示
紫金桥跨平台软实时数据库Web服务器和数据服务器分离访问的配置
紫金桥跨平台软件远程采集RealInfo6.5
使用虚拟机做的工程实现跨网Web访问
紫金桥软件Microsoft Office Access 2003的ODBC数据源配置
紫金桥软件闸门整体自动化监控系统
通过紫金桥软件来提高画面组态速度
组态软件在配套设备中的应用
紫金桥的关系库同步工具简介
紫金桥组态软件与欧姆龙PLC以太网通信(FINS命令)——CPU型号-CJ2M-CPU33
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved