CMarkup递归解析xml所有节点

jfsaka 2008-03-20 03:57:07
近来学习CMarkup类来解析xml文件,可是看完后有个问题,假如我要解析一个xml文件,事先我并不知道xml文件地结构,我只知道我需要读地那些节点地关系,比如我要读该文件下的catalog/section/wine/region 这里region的值,或者我要读catolog/section/region 这里region的值,该怎么办?想到用递归实现,可是该怎么写呢?
还有个问题就是用CMarkup来解析所有的xml文件,前提是我并不知道该文件的结构,那该怎么写呢?请大家提示下思路
...全文
307 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2008-03-21
  • 打赏
  • 举报
回复
想来也是递归吧,得到每遇到一个node,就调用自身递归,

类似如下

enumxml( xmlnode, parent_treenode )
{
if( null == parent_treenode )
new一个
if( xmlnode.nochild )
parent_treenode.add 一个新节点,返回
else
{
parent_treenode.add一个新节点
enumxml( xmlnode的那个child, 刚add的新节点
}
}
iyranly 2008-03-21
  • 打赏
  • 举报
回复
FindElem,FindChildElem,IntoElem,OutOfElem,等方法是最常用的

你到www.firstobject.com上面就可以看到它的Document文档了。

然后自己写一个demo测试一下就知道怎么用了
jfsaka 2008-03-21
  • 打赏
  • 举报
回复
之前在网上看到一篇是用msxml包写的一个解析所有的xml文件从而得到一个树型结构,可是如果要用CMarkup类来进行的话,该怎么做呢?
用户 昵称 2008-03-20
  • 打赏
  • 举报
回复
当初用的是linux下的,现在代码自己都看不懂了。

l_NetworkPtr
parse_l_network( xmlDocPtr doc, xmlNodePtr node )
{
#define safe_new_network\
if( !network )\
{\
network = malloc( sizeof( l_Network ) );\
memset( network, 0, sizeof( l_Network ) );\
}
l_NetworkPtr network = NULL;
node = node->xmlChildrenNode;
while( NULL != node )
{
if( compare( node, "DHCPen" ) )
{
safe_new_network;
network->dhcpen = xmlNodeGetContent( node );
}
if( compare( node, "IpAddress" ) )
{
safe_new_network;
network->ip = xmlNodeGetContent( node );
}
if( compare( node, "NetMask" ) )
{
safe_new_network;
network->mask = xmlNodeGetContent( node );
}
if( compare( node, "Gateway" ) )
{
safe_new_network;
network->gateway = xmlNodeGetContent( node );
}
if( compare( node, "IP6" ) )
{
safe_new_network;
network->ip6 = xmlNodeGetContent( node );
}
node = node->next;
}
return network;
}
jfsaka 2008-03-20
  • 打赏
  • 举报
回复
感谢楼上兄弟的解答,不过可以详细一点么?就是如果不知道xml文件的结构,用CMarkup类怎么把文件的内容都读出来呢?是不是类似遍历树的那种算法呢?
用户 昵称 2008-03-20
  • 打赏
  • 举报
回复
以前写过类似的,将参数用"first/second/third"方式传进来

node = getrootnode;

while( node->haschilenode )
{
node = node->getfirstnode();
para = getfirstpara(); //para = first
do
{
while( node->caption != para )
{
node = node->nextnode;
if( !node )
{
return; //没找到
}
}
para = getnextpara();
} while( 1 );

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧