XML文件处理的思考[2004年5月11日 10:18]
2004-07-11 03:42
281 查看
1。用分隔符隔开的字符串表示节点路径信息(BCB)。思考原因,一些简单的参数,如果嵌
套的比较深入的话,如果用一般XML处理的方法,逐步深入,需要定义好些变量,太麻烦。
假设XML文件为
ohahu
6800
50
访问XNetConfig的Port子节点的方法需要先获取XNetConfig节点,然后再获取Port节点。
下面通过通过字符串“XNetConfig.Port”来直接获取Port节点。
函数实现如下:
//定义一个回调函数模板。这样,对于所有找节点的操作就不用关心,只要关心你要对这
个节点做什么
//函数返回值类型bool*表示是指针ActionProc名称参数_di_IXMLNodepNode,void*
pValue(void*pValue为自适应)
typedefbool(*ActionProc)(_di_IXMLNodepNode,void*pValue);
//AnsiString和CString是类似的
boolRetrieveNodeByDir(_di_IXMLNodepParent,AnsiStringstrList,void*pValue,ActionProcdoit)
{
try
{
_di_IXMLNodeListChildList=pParent->ChildNodes;
if(ChildList==NULL||strList==NULL)
returnfalse;//节点不存在,自然处理就不成功了
else
{
_di_IXMLNodeChildNode;
intnLen=strList.AnsiPos(".")>0?strList.AnsiPos(".")-1:strList.Length();
AnsiStringstrCur=strList.SubString(1,nLen);//这个地方测试不够充分
if((ChildNode=ChildList->FindNode(WideString(strCur)))!=NULL)
{
if(strCur==strList)
{
returndoit(ChildNode,pValue);//调用处理函数
}
else
{
intnStart=strList.AnsiPos(".")>0?strList.AnsiPos(".")+1:1;
strCur=strList.SubString(nStart,strList.Length());
if(GetXMLMinNodeByDir(ChildNode,strCur,pValue,doit))//递归调用,处理子节点
returntrue;
}
}
}
}
catch(...)
{
returnfalse;
}
returnfalse;
}
这个函数,可以通过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创建出来,再由子节点插入的,如
套的比较深入的话,如果用一般XML处理的方法,逐步深入,需要定义好些变量,太麻烦。
假设XML文件为
ohahu
6800
50
访问XNetConfig的Port子节点的方法需要先获取XNetConfig节点,然后再获取Port节点。
下面通过通过字符串“XNetConfig.Port”来直接获取Port节点。
函数实现如下:
//定义一个回调函数模板。这样,对于所有找节点的操作就不用关心,只要关心你要对这
个节点做什么
//函数返回值类型bool*表示是指针ActionProc名称参数_di_IXMLNodepNode,void*
pValue(void*pValue为自适应)
typedefbool(*ActionProc)(_di_IXMLNodepNode,void*pValue);
//AnsiString和CString是类似的
boolRetrieveNodeByDir(_di_IXMLNodepParent,AnsiStringstrList,void*pValue,ActionProcdoit)
{
try
{
_di_IXMLNodeListChildList=pParent->ChildNodes;
if(ChildList==NULL||strList==NULL)
returnfalse;//节点不存在,自然处理就不成功了
else
{
_di_IXMLNodeChildNode;
intnLen=strList.AnsiPos(".")>0?strList.AnsiPos(".")-1:strList.Length();
AnsiStringstrCur=strList.SubString(1,nLen);//这个地方测试不够充分
if((ChildNode=ChildList->FindNode(WideString(strCur)))!=NULL)
{
if(strCur==strList)
{
returndoit(ChildNode,pValue);//调用处理函数
}
else
{
intnStart=strList.AnsiPos(".")>0?strList.AnsiPos(".")+1:1;
strCur=strList.SubString(nStart,strList.Length());
if(GetXMLMinNodeByDir(ChildNode,strCur,pValue,doit))//递归调用,处理子节点
returntrue;
}
}
}
}
catch(...)
{
returnfalse;
}
returnfalse;
}
这个函数,可以通过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中本身就带了用字符串查找节点的函数,汗
参考:
使用方法如下:
再有需要添加节点都是由XMLDocument创建出来,再由子节点插入的,如
相关文章推荐
- XML文件处理的思考
- XML文件处理的思考
- 写了一个简单的处理类似xml文件的类,请大家指正【原创】
- php下使用SimpleXML 处理XML 文件
- XML配置文件的读取处理
- Matlab中处理XML文件
- EFDC主控文件efdc.inp文件的xml格式化处理——转载http://blog.sina.com.cn/s/articlelist_1584892573_0_1.html
- 记录一次mac+idea+springmvc开发的applicationContext.xml读取文件找不到异常处理
- dom4j处理xml文件,读取xml字符串,格式化xml文件
- c# .net获取文件夹下的所有文件(多层递归),并获取区间数据(Jsion,xml等数据)写出到处理文件,学习分享~
- Ibatis SQL配置文件.xml中文乱码处理
- MySQL处理xml文件
- 新版安卓SDK文件activity_main.xml和fragment_main.xml的处理
- ASP.NET WebApi 上传文件时异常 Failed to execute send on XMLHttpRequest 的一个处理方法
- mybaits的xxMapper.xml文件中大于号和小于号处理
- Python使用ElementTree处理xml文件
- Spring MVC静态资源处理(在applicationContex.xml文件中进行配置)
- python对xml的处理和文件的写入操作1
- 在java代码中,用xslt处理xml文件
- 让客户端把ASP文件以XML的方式来处理最简单的实现方法.