当前页面位置: » 丰搜网 » 文档中心 » 详细内容
在c++ builder6中使用xml
处理xml文件当然需要xml parser,而xml parse有包括sax,dom两种类型,sax相对比较简单,dom模型使用则比较困难,而且c++ builer又是使用dom模型来处理xml文件的,所以这里主要讨论dom模型的处理方法。
txmldocument组件使用了ms xml dom模型来处理xml的,msxmldom是基于com的,在vb这样的工具中使用这个com会很容易,而在c++ builer中之所以不容易,我想很大程度上是因为我们先入为主的思维,vcl的类设计的非常容易理解和使用,很多方法见名知意,甚至连帮助都不需要查,而作者在使用txmldocument的时候就不得不查帮助了,很多方法都不能准确知道它的意思,甚至还有陷阱。
本文以一个简单的例子来告诉大家怎样使用txmldocument来处理xml,这个例子是这样的,作者需要一个定时提醒日程安排的的小程序,假设其他的功能都以设计完毕,现在面临的问题是如何保存我们日程安排,这里为了使用xml,所以当然使用xml文件格式来存储。
对于一个日程安排程序,肯定需要有添加删除的功能,基本上上面的操作已经包含处理xml的全部。
我们这样来设计xml文件(tip.xml):
<?xml version="1.0" encoding="gb2312"?> //注意这里的编码格式为gb2312,否则有乱码
<vtip>
<tip>
<mode>0</mode>
<time>2003/4/25?08:01:46</time>
<content>洗衣服</content>
</tip>
<tip>
<mode>1</mode>
<time>2003/4/25?pm 17:30:00</time>
<content>陪女朋友吃饭</content>
</tip>
</vtip> |
上面的
xml文件是比较规矩的格式,没有包括属性和doctype等这样的东西,不过有了下面的知识,你应该很容易处理复杂的格式。
首先是打开xml,现面的代码片断显示了这一过程:
xmldoc->loadfromfile(widestring(pathstring(apppath)+"tip.xml"));
//xmldoc是txmldocument的名字
xmldoc->active=true;
filllist(); //把xml的内容添加到listview |
然后就是如何读取xml的内容(filllist):
lstmain->items->beginupdate();
lstmain->items->clear();
_di_ixmlnode node=xmldoc->documentelement;
//documentelement属性用来得到根节点
_di_ixmlnodelist nodes=node->childnodes;
//得到子节点list
for(int n=0;n<nodes->count;n++)
{
tlistitem* li=lstmain->items->add();
node=nodes->nodes[n]->childnodes->nodes[0];
//得到子节点的子节点,也也就是 vtip//tip//mode
int m=string(node->gettext()).toint();
//得到对应节点的text内容并转换到int
li->caption="";
li->imageindex=m+5;
li->subitems->add(nodes->nodes[n]->childnodes->nodes[1]->gettext());
li->subitems->add(nodes->nodes[n]->childnodes->nodes[2]->gettext());
//代码同上
}
lstmain->items->endupdate();
|
经过上面的代码,我们看到类似于下图的结果:
添加一个节点元素:
bool __fastcall tfrmmain::addtask(int m,
tdatetime& date,
tdatetime& time,
string con)
{
//todo: add your source code here
_di_ixmlnode node=xmldoc->documentelement;
node=node->addchild(widestring("tip"));
_di_ixmlnode subnode=node->addchild(widestring("mode"));
subnode->settext(widestring(m));
subnode=node->addchild(widestring("time"));
subnode->settext(widestring(date.datestring()+"?"+time.timestring()));
subnode=node->addchild(widestring("content"));
subnode->settext(widestring(con));
return true;
} //以上代码很容易理解,读的时候可以对照xml文件的格式 |
最后是删除:
int ind=lstmain->selected->index;
//ind为要删除的节点号
_di_ixmlnode node=xmldoc->documentelement;
int re=node->childnodes->delete(ind);
if (re!=-1)
lstmain->items->delete(ind);
|
上面的代码演示了如何处理一个xml文件,读者可以自己看看帮助,就可以知道处理更复杂的xml文件格式.
(责任编辑:铭铭)