在delphi中使用xml文档的方法

源代码在线查看: 简析xml.txt

软件大小: 3 K
上传用户: llll45356874
关键词: delphi xml 文档
下载地址: 免注册下载 普通下载 VIP

相关代码

				简析Delphi中的XML编程  
				 
				
				XML(eXtensible Markup Language可扩展标志语言)在近几年的信息类杂志、网站上可谓是最抢眼的一词。大大小小的信息产品都争相和它搭上关系,唯恐赶不及这辆快车。有着良好口碑的宝蓝 
				(Borland)系列开发平台也不例外,从6.0版开始就集成了XML组件包,因其使用MSXMLDom解析器,相比于此前广泛应用的XMLParser解析器,MSXMLDom更显规范、中文兼容性更好(元素名、属性名均支持中文),很受开发者青睐。为帮助初学者快速掌握Delphi中的XML编程,笔者特写此文,以供交流。
				
				笔者通过一个读写XML文件的实例来说明XML编程的各个步骤,只需读者有结点、元素、属性的基本概念就能容易的理解本文。笔者所要读入的XML文件结构如下所示,命名为Input.xml。
				
				
				
				
				
				
				
				李华 
				
				14
				
				6287555
				
				
				
				
				
				张三
				
				16
				
				8273425
				
				
				
				
				
				Input.xml文件的第一行是XML的版本说明,属性encoding宣告使用何种字符集建立,默认以Unicode 编码(UTF-8 或UTF-16),这里用中文GB2312码。第二行““是根元素。下面定义了两个学生元素,学生下面嵌套了三个子元素,是对学生的进一步说明。与之相对应的,我们在Delphi中定义如下的学生数据结构,"//"后面的文字是对变量或语句的说明,下同。
				
				TStudent = class {学生}
				
				sex : string; //学生性别
				
				name : string; //学生姓名
				
				age : integer; //学生年龄
				
				phone: string; //电话号码
				
				end;
				
				为了读写,我们需要放置两个TXMLDocument控件,在Delphi VCL面板的Internet标签页里那个标有XML字样的控件就是,当然此控件也可以动态创建,但需要包含必要的文件,这里为简单起见,我们直接放置在窗体上,分别命名为InXMLDoc和OutXMLDoc,InXMLDoc用于调入Input.xml文件,OutXMLDoc用于暂存输出到Output.xml的文档。
				
				在窗体上放个按钮,我们把测试代码直接放置在按钮的单击事件里。先定义几个变量,用来保存临时信息,如下所示:
				
				Root : IXMLNode; //指向XML根结点
				
				Parent_Node: IXMLNode; //指向学生结点
				
				Child_node : IXMLNode; //指向学生的子结点
				
				Student : TStudent; //存单个学生信息
				
				List : TList; //存学生列表
				
				i : integer; //循环变量
				
				
				我们先来读入XML文件,代码如下:
				
				List := TList.Create; //初始化列表
				
				InXMLDoc.LoadFromFile('Input.xml'); //调入Input.xml文件
				
				Root := InXMLDoc.DocumentElement; //取XML文件的根结点,即“”
				
				Parent_Node := Root.ChildNodes.First; //使Parent_Node指向学生结点
				
				while (Parent_Node  nil) do //循环取多个学生,可再多加几个学生信息测试
				
				begin
				
				if (Parent_Node.NodeName = '学生') then //判断是否为学生结点
				
				begin
				
				Student := TStudent.Create; //新建一个学生的结构信息
				
				Student.sex := Parent_Node.Attributes['性别']; //取学生的性别属性 
				
				Child_Node := Parent_Node.ChildNodes.First;
				
				//使Child_Node指向该学生的第一个子结点信息
				
				while (Child_Node  nil) do //循环取学生的各个子各点
				
				begin
				
				if (Child_Node.NodeName = '姓名') then //判断是否为姓名结点
				
				Student.name := Child_Node.Text //取姓名结点的值,取于name字段中
				
				else if (Child_Node.NodeName = '年龄') then //此行起后四行与前两行类似
				
				Student.age := StrToInt(Child_Node.Text)
				
				else if (Child_Node.NodeName = '电话') then
				
				Student.phone := Child_Node.Text; 
				
				Child_Node := Child_Node.NextSibling; //顺序取下一个学生的子结点信息 
				
				end;
				
				List.Add(Student); //把一个学生信息加入列表
				
				end;
				
				Parent_Node := Parent_Node.NextSibling; //顺序取下一个学生信息 
				
				end; 
				
				到这儿,所有的学生信息都已存到List列表里面了,读者可以跟踪代码测试。
				
				
				下面我们把List里的临时学生信息存到Output.xml文件里,代码如下: 
				
				OutXMLDoc.Active := true; //激活OutXMLDoc,自动初始化空的XML文档
				
				OutXMLDoc.Encoding := 'GB2312'; //设置字符集
				
				Root := OutXMLDoc.AddChild('学生花名册'); //建根结点
				
				for i := 0 to List.Count - 1 do //循环取各个学生信息
				
				begin
				
				Student := List.Items[i]; //顺序取一个学生信息
				
				if (Student  nil) then
				
				begin
				
				Parent_Node := Root.AddChild('学生'); //根结点后添加一个学生结点
				
				Parent_Node.Attributes['性别'] := Student.sex; //给学生结点设置性别属性 
				
				Child_Node := Parent_Node.AddChild('姓名'); //学生结点后添加一个姓名结点
				
				Child_Node.Text := Student.name; //设置姓名的文本值 
				
				Child_Node := Parent_Node.AddChild('年龄'); //此行起后四行与前两行类似
				
				Child_Node.Text := IntToStr(Student.age); 
				
				Child_Node := Parent_Node.AddChild('电话');
				
				Child_Node.Text := Student.phone;
				
				end;
				
				end;
				
				OutXMLDoc.SaveToFile('Output.xml'); //把组织好的XML文档存于Output.xml文件中
				
				OutXMLDoc.Active := false; //钝化(关闭)OutXMLDoc 
				
				List.Free; //最后释放保存临时学生信息的列表
				
				
				好了,看看Input.xml和Output.xml内容是不是一样。是不是很简单呢?其实在C++ Builder也有相同的组件,只需将Pascal语法转换成C++语法,上面的代码就完全可以用了。有兴趣的朋友可与笔者进一步交流其它XML应用以及程序设计模式、J2EE开发、Rose UML建模等知识,记住我的E-Mail:nbDeveloper@hotmail.com。 
				 
							

相关资源