用户中心
· 企业空间 首页 | 资讯 | 技术 | 产品 | 企业 | 直播 | 专题 | 智能制造 | 论坛| 在线研讨会
紫金桥软件技术有限公司
企业空间 > 案例应用 > 正文
  • 紫金桥软件读写XML文件
  • 发布时间:2016/7/27 13:49:30   修改时间:2016/7/27 13:42:47 浏览次数:1625
  • 一、概述

    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脚本逻辑

    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

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

  • 企业介绍
紫金桥软件技术有限公司(RealSoft)是由中石油出资成立的专门从事计算机软件产品开发的高新技术企业,是中国石油天然气集团的软件开发基地。公司专注于自主知识产权软件产品“实时数据库系统”和“监控组态软件”的开发与推广工作,以为企业集团及客户…  更多>>
  • 联系方式

紫金桥软件技术有限公司

联系人:李磊

地址:黑龙江省大庆市高新区服务外包产业园C1-817室

邮编:163316

电话:400-6996-515

传真:0459-8151391-808

公司网址:http://www.realsoft.cc

  • 该空间手机版

扫描此二维码即可访问该空间手机版

  • 在线反馈
1.我有以下需求:



2.详细的需求:
姓名:
单位:
电话:
邮件:
您还没有登录,请登陆,
如果您还没有注册,点击这里注册.
  • 网友反馈
  • 戴永铁 在2024/6/11 14:51:00留言
  • 留言类型:贵公司产品销售人员联系我,贵公司技术支持人员联系我,
  • 详细留言:需要制药工业领域的实时库报表,包含矩阵配?、参数配方、数据(统计和历史)、曲线、事件、报警、审计追踪,这些内容可以组态化
  • 晓同 在2024/5/16 11:06:00留言
  • 留言类型:我让贵公司产品销售人员联系我,
  • 详细留言:紫金桥组态软件V6.5,512点授权
  • 在2023/10/21 16:03:00留言
  • 留言类型:贵公司技术支持人员联系我,
  • 详细留言:OPC
  • 郑鑫汶 在2023/6/1 14:58:00留言
  • 留言类型:我想得到贵公司产品详细资料,我想得到贵公司产品的价格信息,我让贵公司产品销售人员联系我,我让贵公司技术支持人员联系我,
  • 详细留言:需要咨询贵公司软件的价格功能
  • 吴吉校 在2023/3/15 7:45:00留言
  • 留言类型:我想得到贵公司产品详细资料,我想得到贵公司产品的价格信息,我让贵公司产品销售人员联系我,我让贵公司技术支持人员联系我,
  • 详细留言:组态软件咨询
更多请进入空间管理中心查看
关于我们 | 网站地图 | 联系我们
© 2003-2018    经营许可编号:京ICP证120335号
公安机关备案号:110102002318  服务热线:010-82053688
我要反馈