XML文件处理的思考[2004年5月11日 10:18]

原创 2004年07月11日 03:42:00

1。用分隔符隔开的字符串表示节点路径信息(BCB)。思考原因,一些简单的参数,如果嵌
套的比较深入的话,如果用一般XML处理的方法,逐步深入,需要定义好些变量,太麻烦。


    假设XML文件为
 
  ohahu
  6800
  50

访问XNetConfig的Port子节点的方法需要先获取XNetConfig节点,然后再获取Port节点。
下面通过通过字符串“XNetConfig.Port”来直接获取Port节点。
函数实现如下:
//定义一个回调函数模板。这样,对于所有找节点的操作就不用关心,只要关心你要对这
个节点做什么
//函数 返回值类型bool *表示是指针 ActionProc名称 参数_di_IXMLNode pNode,void *
pValue(void *pValue为自适应)
typedef bool (*ActionProc)(_di_IXMLNode pNode,void *pValue);

//AnsiString和CString是类似的
bool RetrieveNodeByDir(_di_IXMLNode pParent,AnsiString strList,void *pValue,ActionProc doit)
{
   
try
   
{
       
_di_IXMLNodeList ChildList = pParent->ChildNodes;
       
if(ChildList==NULL||strList==NULL)
           
return false;//节点不存在,自然处理就不成功了
       
else
       
{
           
_di_IXMLNode ChildNode;
           
int nLen = strList.AnsiPos(".")>0?strList.AnsiPos(".")-1:strList.Length();
           
AnsiString strCur = strList.SubString(1,nLen);//这个地方测试不够充分
           
if((ChildNode = ChildList->FindNode(WideString(strCur)))!=NULL)
            {
               
if(strCur==strList)
                {
                   
return doit(ChildNode,pValue);//调用处理函数
               
}
               
else
               
{
                   
int nStart = strList.AnsiPos(".")>0?strList.AnsiPos(".")+1:1;
                   
strCur = strList.SubString(nStart,strList.Length());
                   
if(GetXMLMinNodeByDir(ChildNode,strCur,pValue,doit))//递归调用,处理子节点
                       
return true;
                }
            }
        }
    }
   
catch(...)
    {
       
return false;
    }
   
return false;
}

这个函数,可以通过ActionProc来执行设置节点值、属性,获取节点值、属性,等操作。
后面有ActionProc的范例

////----------------------------------------------------------------------------------------------
2。根据节点名称来查找节点

如上面的Port节点,只需要一个”Port”作为参数,而不需要完整路径。当然,这样如果
整个文档有多个Port的时候,将不能识别,但是可以经过修改,使这个函数能支持查找所
有符合条件的节点。如果能和上面一样加入回调函数更好。
函数如下:

 

////----------------------------------------------------------------------------------------------
3。从上面可以看出,在遍历的函数中使用回调函数是一个非常好的选择。当然要定义一个
良好的回调函数,这个就是C++的优势,比如在上面的void指针,我们可以把void指针随便
转换成需要的类型。指针的转换,除了下面的直接转换以外,还有dynamic_cast,static
_cast,const_cast,其中static_cast用的比较多,具体的还是自己找资料去。做程序,少
不了的就是找资料。

第一个函数的回调函数示例:
//获取节点属性

 

使用示例:

 


也许有人不明白用回调函数的意义是什么,顺便啰嗦两句。
一个比较浅显的应用是把上面1(包括typedef),其实可以把它封装到dll文件中(这里不考虑线程问题),这样在Exe中动态调用(LoadLibrary,GetProcAddress)的时候,只要指定一个实现的函数,比如上面的设值,读值等,就可以使用了,完全不用关心,如何去按照“xxx.aa”这样的路径怎么找到等实现细节。而且,对于实现不同的功能,这样检索路径的代码,只需要写一次就行了。需要注意的是,ActionProc必须是一个固定的结构(参数,返回值),可能是不同的数据类型,但占的字节数,必须一样。

////----------------------------------------------------------------------------------------------
4.上面提到_di_IXMLNode是一个接口,Com的调用多有一个差不多的规律,当然,在VC中有不同的实现过程,这里说一下我觉得有必要说的XML的Com调用的部分内容
#import "C://Windows//system32//MSXML.DLL" named_guids
在stdafx.h里面加入这句,引入XML调用,相关可以看
//初识Com的应用总结
//http://bbs.hziee.edu.cn/bbscon.php?board=vc&id=239

在微软的许多COM中常常出现的get__newEnum的使用,懂得了他的使用方法,也就知道了怎么遍历
具体也不说很多了,先把遍历节点的代码贴出来,因为,自己对COM的机理也没有很大的把握,下面说错了,可不要扔石头啊,呵呵

 

上面关于get_newEnum的用法,来自CSDN论坛VC版老大哥masterz的指导,另外还有一个成员_newEnum的使用,我也没有试出来,参考上面的方法,老是出错,如果有哪位试出来了,麻烦告知。
COM的处理流程在《vc技术内幕 第五版》的电子版第四章(到网上找一下)中有较好的介绍。

 

6月26日 2:43补:关键字:字符串定位XML节点,XML插入节点

竟然发现MSXML中本身就带了用字符串查找节点的函数,汗

参考: http://www.vcer.net/showTip.jsp?tipid=2248

使用方法如下:

再有需要添加节点都是由XMLDocument创建出来,再由子节点插入的,如

软件设计师历年真题全汇总(2004上半年-2015上半年上下午)(答案+解析)

  • 2017年11月02日 09:31
  • 27.4MB
  • 下载

滴滴打车2015-2016

2015年 2015年1月17日晚,由腾讯应用宝、安徽卫视共同主办的“2014腾讯应用榜样——应用宝星APP之夜”在北京工人体育馆举行,滴滴打车获评年度“最具突破出行APP”。滴滴公司副总裁罗文上台...
  • zyk19990702
  • zyk19990702
  • 2016-05-23 21:56:19
  • 1649

党史上的今天——1947年 晋冀鲁豫军区第四纵队在晋南举行反攻

1947年4月4日至5月11日 晋冀鲁豫军区第四纵队在晋南举行反攻,歼敌1.4万余人,收复县城20余座,彻底粉碎了胡宗南、阎锡山两部的联防体系。 1955年4月4日  中共七届五中全会 1955年4...
  • our2848884
  • our2848884
  • 2017-04-17 15:24:02
  • 98

给中国学生的第三封信:成功、自信、快乐(李开复)--转载

2004年5月此前,我和中国学生的多次交流都是围绕如何达到优秀和卓越、如何成为领导人才而展开的。最近,在新浪网的聊天室和我收到的许多电子邮件中,我发现更多的中国学生需要知道的不是如何从优秀到卓越,而是...
  • SwordsmanH
  • SwordsmanH
  • 2005-06-07 11:48:00
  • 699

SHL官网Numerical练习题打印版2008年5月11日

  • 2014年10月25日 11:41
  • 466KB
  • 下载

Git-2.8.2-64-bit

  • 2016年05月11日 17:17
  • 29.7MB
  • 下载

2004年5月软件设计师考试上午试题及解答

  • 2008年09月14日 20:09
  • 293KB
  • 下载

计算2017年11月11日 11时 11分 11秒 距离当前日期的时间差, 并以指定的格式(天/时/分/秒)的形式显示.

practice5 计算2017年11月11日 11时 11分 11秒 距离当前日期的时间差, 并以指定的格式(天/时/分/秒)的形式显示. var date = new Da...
  • Endeavor_No1
  • Endeavor_No1
  • 2017-08-30 20:19:40
  • 760

BITCS2016程序设计 | 26. 完美序列

26. 完美序列 成绩 10 开启时间 2016年09月21日 星期三 12:55 折扣 0.8 折扣时间 2016年09月25日 星期日 23:55 允许迟交 否...
  • iLOVEJohnny
  • iLOVEJohnny
  • 2016-11-26 18:15:29
  • 520

2015年5月11日邮件华盟电子书·第四期

  • 2016年12月28日 16:56
  • 73KB
  • 下载
收藏助手
不良信息举报
您举报文章:XML文件处理的思考[2004年5月11日 10:18]
举报原因:
原因补充:

(最多只允许输入30个字)