多个XML文件合并的问题?

xiaokun111 2006-03-14 02:17:21
由于数据由客户端得出多个XML文件,
每个XML为一张表。
一个ClientDataSe对象只能处理一张表,若要进行多表查询比如说:
select a,b,c from x,y,z where x.id=y.id and x.id=z.id
ClientDataSet 就无能为力,只有将所有表连起来,供ClientDataset操作,
怎样将XML文件合并啊?(所有操作都在客户端进行,与服务器是非连接)
...全文
368 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
biao_227 2006-03-28
  • 打赏
  • 举报
回复
转载xml编程
通过一个读写XML文件的实例来说明XML编程的各个步骤,只需读者有结点、元素、属性的基本概念就能容易的理解本文。所要读入的XML文件结构如下所示,命名为Input.xml。
<?xml version="1.0" encoding="GB2312"?>
<学生花名册>
<学生 性别 = "男">
<姓名>李华</姓名>
<年龄>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; //最后释放保存临时学生信息的列表
xiaokun111 2006-03-27
  • 打赏
  • 举报
回复
请版主为我结贴!
  • 打赏
  • 举报
回复
把多个XML合并长一个,你就把其他XML文件内容加入到其中一个中间去不就可以了??
xiaokun111 2006-03-17
  • 打赏
  • 举报
回复
大家说说啊
lextm 2006-03-15
  • 打赏
  • 举报
回复
每个XML为一张表?
------------------
这个就可以改成多个表。

如果这个不能改,那么合并的方法似乎在Help里面有。

Delphi Developer's Guide to XML里面也有相关说明。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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