请选择 进入手机版 | 继续访问电脑版

唐康林NX二次开发论坛

 找回密码
 立即注册
查看: 1713|回复: 17

[技术分享] NX二次开发快速解析.xml文件的方法-唐康林原创

[复制链接]

555

主题

740

帖子

3336

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3336
发表于 2018-2-7 16:32:37 | 显示全部楼层 |阅读模式
文/唐康林 独家原创 QQ125317589
      NX的开发做久了,很多同学就会发现,经常要处理的就是一堆数据,在贴子http://www.nxopen.cn/thread-1242-1-1.html跟大家讲了怎么简单的向电子表格写数据,在实战项目中,除了文本文档(如.txt,.dat等)这类常见格式用来做配置外,我们其实较少用电子表格来存数据,因为这个玩意比较慢。
      很多时候,做项目,我们都是做.xml文件,.xml文件一般人可能看不太懂,然后会就会给客户一个小工具,可以把xml文件打开后,像电子表格一样的,用户编辑,再保存为xml文件就可以了,这样管理员,配置就会方便很多。
      但是,我们开发的时候,怎么来解析xml文件呢?(我指的是用C/C++语言)
      估计大家都不太喜欢com组件方式吧?这个代码写起来怪怪的,代码量也大。网上你去搜一下,发现一堆答案告诉你怎么解析xml文件,在这里,我推荐一下,我觉得执行效率高,代码写起来简单的工具,那就是pugixml,官网https://pugixml.org/ 进去下载后,会有例子与.hpp与.cpp。
       我们用到就三个文件:pugiconfig.h pugixml.h pugixml.cpp 正常情况下,把这三个文件加到你的工程里面就可以用了。
       注意:如果想只是包含头文件pugixml.h,则需要在pugiconfig.hpp中更改成下面这样:(去掉前面的//注释)
  1. // Uncomment this to switch to header-only version
  2. #define PUGIXML_HEADER_ONLY
复制代码
     如果使用的编码是Unicode也要在上面说的这个文件中更改成如下:
  1. // Uncomment this to enable wchar_t mode
  2. #define PUGIXML_WCHAR_MODE
复制代码
     一切准备好,接下来讲一个例子,如果我在c:\\CV5CAAIHMIC.xml的xml文件如下:
  1. <?xml version='1.0' ?>
  2. <codeFramework xmlns = "no">
  3.         <firstNode>
  4.                 <prerequisite name = "System" access = "Protected"/>
  5.                 <prerequisite name = "ApplicationFrame" access = "Protected"/>
  6.                 <prerequisite name = "Dialog" access = "Protected"/>
  7.                 <prerequisite name = "AutomationInterfaces" access = "Protected"/>
  8.                 <prerequisite name = "DialogEngine" access = "Protected"/>
  9.                 <prerequisite name = "CV5CAADMB" access = "Protected"/>
  10.                 <prerequisite name = "CV5CAATools" access = "Protected"/>
  11.                 <prerequisite name = "CV5CAAErrorMessageHandler" access = "Protected"/>
  12.                 <prerequisite name = "CV5CAAJournaling" access = "Protected"/>
  13.                 <prerequisite name = "CV5CAAEnvironment" access = "Protected"/>
  14.                 <prerequisite name = "CV5CAAUtils" access = "Protected"/>
  15.         </firstNode>
  16. </codeFramework>
复制代码
     我想读出来,并打印出来每个属性,就可以下面这样写代码:
  1. char msg[256];
  2. UF_UI_open_listing_window();

  3. //读取
  4. const char *strFilePath = "c:\\CV5CAAIHMIC.xml";
  5. pugi::xml_document xmlDoc;
  6. pugi::xml_parse_result fileLoadStatus = xmlDoc.load_file(strFilePath, pugi::parse_default, pugi::encoding_utf8);
  7. if (fileLoadStatus.status)
  8. {
  9.         lw->WriteLine(fileLoadStatus.description());
  10.         return;
  11. }

  12. pugi::xml_node rootNode = xmlDoc.child(L"codeFramework");
  13. pugi::xml_node fistNode = rootNode.child(L"firstNode");
  14. for (pugi::xml_node node = fistNode.first_child(); node; node = node.next_sibling())
  15. {
  16.         UF_UI_write_listing_window("prerequisite");
  17.         for (pugi::xml_attribute attr = node.first_attribute(); attr; attr = attr.next_attribute())
  18.         {
  19.                 sprintf(msg, ", %s = %s", UnicodeToAnsi(attr.name()), UnicodeToAnsi(attr.value()));
  20.                 UF_UI_write_listing_window(msg);
  21.         }
  22.         UF_UI_write_listing_window("\n");
  23. }
复制代码
      打印出来的效果如下:
xml读取效果.png
       上面代码用到字符转换,可以下面这样写:
游客,如果您要查看本帖隐藏内容请回复
     讲了读取,接下来说一下写入,例子如下:
游客,如果您要查看本帖隐藏内容请回复
       最后效果如下:
写入xml文件效果.png
回复

使用道具 举报

2

主题

40

帖子

359

积分

终日乾乾

Rank: 3Rank: 3

积分
359
发表于 2018-2-7 22:44:54 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

11

帖子

431

积分

终身VIP会员

Rank: 6Rank: 6

积分
431
发表于 2018-2-7 23:20:12 | 显示全部楼层
来学习学习!
回复 支持 反对

使用道具 举报

1

主题

32

帖子

612

积分

终身VIP会员

Rank: 6Rank: 6

积分
612
发表于 2018-2-24 10:33:07 | 显示全部楼层
学习学习
回复

使用道具 举报

2

主题

66

帖子

1187

积分

终身VIP会员

Rank: 6Rank: 6

积分
1187
发表于 2018-2-24 11:21:43 | 显示全部楼层
谢谢分享啦啦啦
回复 支持 反对

使用道具 举报

0

主题

92

帖子

1023

积分

飞龙在天

Rank: 6Rank: 6

积分
1023
发表于 2018-3-9 11:03:29 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

1

帖子

23

积分

潜龙勿用

Rank: 1

积分
23
发表于 2018-3-10 22:59:00 | 显示全部楼层

谢谢分享
回复

使用道具 举报

0

主题

12

帖子

51

积分

见龙在田

Rank: 2

积分
51
发表于 2018-3-12 16:46:23 | 显示全部楼层
学习一下,谢谢分享
回复 支持 反对

使用道具 举报

3

主题

20

帖子

134

积分

终身VIP会员

Rank: 6Rank: 6

积分
134
发表于 2018-3-15 14:30:44 | 显示全部楼层
学习了,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

9

帖子

35

积分

潜龙勿用

Rank: 1

积分
35
发表于 2018-4-14 21:00:07 | 显示全部楼层
感谢唐工分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋| ( 蜀ICP备16014681号

GMT+8, 2018-9-19 01:35 , Processed in 0.099434 second(s), 25 queries .

Powered by www.nxopen.cn

© 2001-2013 nxopen.cn

快速回复 返回顶部 返回列表