嫩叶草回家旧址图片高清_免费18款深夜禁用黄尿入口_禁止18勿入的30000部芒果

  • IIANews微官网
    扫描二维码 进入微官网
    IIANews微信
    扫描二维码 关注微信
    移动客户端
  • English
2024全景工博会
控制软件

紫金桥软件读写XML文件

  2016年09月08日  

  一、概述

  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文件夹,并选择“”文件,然后点击“打开”按钮。

 

  然后在弹出的画面中输入名字“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 !#(#) then

  MsgBox("读取文件失败!");

  return;

  endif

  //将XML信息显示在树形控件上:

  int nRoot = #tNode();

  string strKey = "";

  #AllNode();

  if nRoot>0 then

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

  fun_ToTree(nRoot,strKey);

  endif

  fun_ToTree函数的声明如下:

 

  fun_ToTree函数体如下:

  //Function name: fun_ToTree

  int nNodeTemp = 0;

  string strNodeTemp = "";

  //设置树控件结点文本:

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

  //将XML结点标识保存在对应的树控件结点中:

  #eData(strFatherKey,nNode);

  nNodeTemp = #stChildNode(nNode);

  while nNodeTemp>0 do

  //在树控件上增加一个子结点:

  strNodeTemp = #ItemTail(strFatherKey,"");

  //递归调用:

  fun_ToTree(nNodeTemp,strNodeTemp);

  nNodeTemp = #tNode(nNodeTemp);

  endwhile

  这个函数使用递归算法遍历XML结点信息。

  进入窗口脚本:

  OpenChild("win_nodeProperty");//打开属性信息窗口

  树形控件脚本:

  打开树形控件属性画面,点击“全局脚本”按钮,在弹出的画面中选择“单击脚本”,添加如下代码:

  fun_OnLbtnDown()

  fun_OnLbtnDown()函数体如下:

  int nData = -1;

  if #SelNodeKey()<>"" then

  nData = #SelNodeData();

  //刷新属性信息窗口:

  #_ShowProperty(#win_xml,nData);

  endif

  fun_ShowProperty函数声明:

 

  fun_ShowProperty函数体:

  # = nNode;

  # = #eName(nNode);

  # = #eText(nNode);

  string strPath = "";

  int nNodeTemp = 0;

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

  //向上遍历生成本结点的路径名:

  nNodeTemp = nNode;

  strPath = #eName(nNode);

  while nNodeTemp>0 do

  nNodeTemp = #entNode(nNodeTemp);

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

  endwhile

  # = strPath;

  //生成属性报表:

  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函数用于生成指定XML结点的属性信息字符串,其函数声明如下:

 

  fun_GetAttribInfo函数体如下:

  //Function name: fun_GetAttribInfo

  string strArrAttribNames[];

  int i = 0;

  string strText = "";

  string strS = AscToChar(34);//双引号作为分隔符

  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;

  四、结语

  这个示例演示了如何使用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()用于保存文件。

最新视频
研祥智能AI无风扇工业控制器M60C   
ifm传感器课堂:IO-Link主站AL1X0X与Profinet通讯组态演示   
TE 成就稳定、高效的新能源储能系统
研祥金玛
专题报道
2024全景工博会
2024全景工博会 2024工博会以“工业聚能 新质领航”为全新主题,旨在瞄准我国新型工业化高质量发展的核心技术和重点领域,为产业转型升级提供良好的示范样板。
企业通讯
《我们的回答》ABB电气客户故事
《我们的回答》ABB电气客户故事

全球能源格局加速重构的今天,怎样走好复杂且极具挑战的电气化转型之路?如何用创新技术实现更多电力和更低排放,从而创造美好世

开关电源在设备升级中的性能影响和选型技巧
开关电源在设备升级中的性能影响和选型技巧

随着《中国制造2025》等政策的推进,新一代工业浪潮来临,工控行业迅猛发展,自动化设备需求与日俱增。众所周知,电源是设备

在线会议
热门标签

社区

高阳县| 当阳市| 亚东县| 淅川县| 龙江县| 伊川县| 石阡县| 泸定县| 霍山县| 温州市|