admin 管理员组

文章数量: 1086019


2024年4月20日发(作者:之梦最终下载页)

维普资讯

………………………………………………………… 

实用第一 智慧密集 

………………………………………………………… 

树型 件XML支件之向的数据钴移 

樊延平 

摘要本文就树型控件和XML文档之间的数据转移技术进行了探讨,通过递归调用的方 

法.避免陷入树型控件和XML文档组织数据的复杂逻辑关系中去,简洁了代码, 

提高了效率。 

关键词树型控件,XML,数据转移 

AfxMessageBox( OLE initialization Error! ): 

引言 

树型控件作为一种数据展示和操控控件,具有目录式、分 

2。读写XML文件 

XML作为一种独立的技术框架,以及数据的半结构化存 

储方式,都决定了对XML文件中数据的访问和操作具有一定 

的特殊性。需要通过专门的接口才能访问。在编程中,首先应 

定一个访问XML文件的文档对象,然后创建该对象,并调入 

目标XML文件来存取和组织数据。具体实现代如下: 

CXMLDOMDocument2 Doc; //定义XML文档对象 

try{ 

Doc= CDOMDocument40Class:: CreateXMLDOMDocu— 

类管理的特征,便于直观、快捷的处理业务数据,得到了广大 

软件设计人员和软件客户的认可和青睐。但是随着数据存储技 

术和理论的发展,XML技术作为一种成熟的数据存储和管理 

技术,也f3益得到人们的广泛关注。由于它们各自所具有的优 

点,以及它们在数据的展示形式上的相似性,树型控件和 

XML技术在软件设计中一起应用的案例越来越多。本文就程 

序设计中树型控件和XML文件之间的数据转移问题进行探 

讨,并设计了相应的数据转移程序。 

ment2()://创建XML文档对象 } 

catch(CComException pE) 

pE一>Delete(): 

return; } 

Doc。SetAsynclFALSE): 

{ 

二、XML特点 

随着XML技术的不断发展和完善,XML逐渐成为数据存 

储和交换的标准格式,广泛应用于包括小型的配置文件到公司 

级数据仓库等数据管理和服务行业。XML文档的半结构化数 

据组合特征,方便了人们管理数据的需要。它在数据的表示和 

存储方面具有许多优势,主要表现在: 

1.天然的树形结构。由于XML以树型结构组织数据,符 

if(Doc.Load((LPCSTR)strFileName))//)jl ̄载XML文件{ 

entityNode=Doc。SeIectSingIeNode( 学科门类 ): 

//访问×ML文件的第一个节点 

strNodeName=entityNode.GetNodeName(): 

//获得×ML文档中的节点名称 

hltem=re_Tree.Insertltem(strNodeName.TVI-ROOT): 

合了人们认识和组织事物的习惯,因此选用XML形式描述不 

同事物之间的逻辑关系,是一种自然的选择。这样,基于 

//将XML节点名称增加到树型结构的根节点的位置 } 

else ( 

CStringstr( 文件不存在或者文档内容为空! ): 

MessageBox(str.NULL,MB_OK): 

return; } 

XML标准丰富的功能,能够有效地降低成本,提高效率。 

2.良好的自描述性。基于XML的半结构化数据具有强大 

的自描述能力,能够大大增强数据的独立性,便于不同事物之 

间独立地存储数据,同时又能保证不同节点之间的逻辑关系。 

3.将XML文件的半结构化数据转移到树型控件 

树型控件和XML文件的数据转移,需要将XML文件的半 

结构化数据转移到树型控件,以及将树型控件中的数据转移到 

xML文件。 

三、编程设计 

1.接口初始化 

将XML文件的半结构化数据转移到树型控件时,应首先 

访问XML文件的根节点,获得根节点的名称,并增加的相应 由于对XML文件的操作,应用了OLE技术,因此,在系 

统创建时,应首先调用AfxOlelnit()函数初始化OLE动态链接 

库。具体代码如下: 

if(!Af)(Olelnit()) 

的树型控件的根节点的位置,然后调用递归函数Bulit一 

r eenl0瑚【)【MLFiles f HTREErrEM hltem,CXMLDOMNode entityN— 

ode)实现数据的转移,下面详细介绍该递归函数的设计流程及 

维普资讯

编码实现。 

//根据XML文件的内容生成树型控件 

Void BulitTreeFromXMLFilesI HTREEITEM hltem。CXML- 

DOMNode entityNode) f 

HTREEtTEM hSubltem; //树型子节点 

CStringstrNodeName=一://子节点名称 

BOOL BeWorking; //是否拥有子节点标志 

intcount; //子节点的个数 

CXMLDOMNodeList nodeLists;//子节点列表 

BeWorking=entityNode.HasChiIdNOdes(): 

//节点entiytNode是否拥有子节点 

if(BeWorking) { 

//有子节点时,获得所有的子节点并记录子节点的个数 

nodeListS=entiytNode.GetChildNodes(1: 

ocunt=nodeLis,ts.GetLengthI): 

} 

inti=0://计数器 

//遍历节点entityNode拥有的所有子节点,并增加到树型控 

?? 

while fBeWorking&&(i<count)) 

//当前节点有子节点时.并且i<count fl 

//获得第i个子节点,并将节点名称增加到树型控件的相应 

//位置 

entiytNode=nodeLists.GetItemIi): 

strNodeName=entiytNode.GetN0d6NameI): 

hSubltem=m

_

Tree.Insertltem(strNodeName,hltem): 

//判断第i个子节点是否拥有子节点,进入递归调用 

BulitTreeFromXMLFiles I hSubltem,entiytNode): 

i-I--I-: } } 

4.将树型控件中的数据转移到XML文件 

将树型控件中的数据转移到XML文件时,只需要将树型 

结构的内容依次增加到相应的XML文档对象DOC中,直到数 

据转移完毕,将该文档对象保存成XML文件即可。其主要过 

程可通过递归函数BulitXMLFilesFromTree(HTREEITEM hhem, 

CXMLDOMElemententityNode,CXMLDOMDocument2 Doc 1)来实 

现。 

Void BulitXMLFilesFromTreeI HTREEITEM hltem,CXML- 

DOMElement entityNode. 

CXMLDOMDoe.urnent2 Docl} 

{ 

HTREEITEM hSubltem; 

CS ̄ing strNodeName=一: //子节点名称 

BOOL BeWorking: //是否拥有子节点标志 

int coupt=0: //子节点的个数 

CObArray nodeLists; 

nodeLists.SetSize(100.一1): //设置对象数组 

BeWorking=mJroe.ItemHasChildren I hltem): 

//树型控件中的当前节点是否拥有子节点 

//当前节点是否拥有子节点时,记录所有的子节点,并计算 

//子节点的数量 

扦(BeWorking) 

{ 

hSubltem=m

Tree.GetChildltem I hltem): 

ocunt-I-+: 

nodeLists,: SetAtI count一1.ICObieGtI-)hSubltem): 

hSubltem=mJree.GetNextSiblingltem l hSubltem): 

while I hSubltem!=NULL) 

{ 

count-I--I-: 

nodeLists.SetAtl count一1.1CObject})hSubltem): 

hSubltem=mJree.GetNextSiblingltemIhSubltem): 

} 

} 

inti=0: //计数器 

//遍历hltem的所有子节点,并增加到DOC对象中 

hwile(BeWorking&&(i<COUnt1)//当前节点有子节点时 

f 

//获得第i个子节点 

hSubltem IHTREEITEM)nodeLists.GetAtI;): 

strNodeName=m

_

Tree.GetltemText(hSubltem): 

CXMLDOMElement newNode; 

newNode=Doc1.CreateElementIstrNodeName): 

’ 

entityNode.AppendChild I newNode): 

//增加到DOC对象的相应位置 

//判断第i个子节点是否拥有子节点,进入递归调用 

BulitXMLFilesFromTree I hSubltem.newNode.Doc1): 

i十-I-: 

} 

nodeLists.RemoveAII I): 

} 

童—∞j-t蝣 晤面 一 

i_D ■1 毫 叠 } 

▲ 

半 一 

s 

敲 

虢 

工 

电子  。

龃 

舡‘ ’}一 

l 

h,d ̄IL I 

...................

_-J 

鼍 ~警薛 ~ 

程序运行界面 

四、结语 

通过递归函数实现XML文档数据和树型控件数据之间的 

转移,不仅代码简洁,便于理解,而且能够较大的提高程序的 

运行效率。本软件代码在Win XP操作系统上,安装 

MSXML4.0开发包,VC++6.0中编译调试通过。 

(收稿日期:2006年12月16日1 


本文标签: 数据 节点 控件