我知道 该如何设置 active form ,但要在active form 中如何控制xml呢?
比如:1 、在服务器现在一个XML文件a,如何通过active from 显示到客户端
  
2、如何通过客户端修改该XML文件呢?发现xml文件有错误数据,要进行修改?如何做呢?

解决方案 »

  1.   

    我对XML也是刚刚开始学习,有兴趣的话可以留下QQ号码,我们一起研究学习。
    我做的一个DLL的代码(部分):
    function TASPCOMa.CreateXML(const SqlStr, xmlFileName: WideString): SYSINT;
    var
        XmlADOQuery: TADOQuery;
        EditXMLDoc: TXmlHelper; //TXmlHelper对象
        ElementNode: IXMLNode;        //s:ElementType的节点
        FirstNode, ADDNode, ScheamNode: IXMLNode;
        TableName: WideString;//数据表名
        PrimKeySQL, AllFieldName: String;   //主键字段
        FieldName, FieldDataType: String;    //字段名, 字段类型
        i, fieldNum, jqka: Integer;//字段个数(s:ElementType的节点)
    begin
        If UpperCase(Copy(Trim(SQLStr),1,6)) <> 'SELECT' Then
        begin
            Result := -1; //SQL语句非法
            Exit;
        end;
        If UpperCase(Copy(Trim(xmlFileName),Length(Trim(xmlFileName))-2,3)) <> 'XML' Then
        begin
            Result := -2; //形成的XML文件的文件名非法
            Exit;
        end;    Try
            //创建对象
            XmlADOQuery := TADOQuery.Create(nil);        XmlADOQuery.Connection := ADOConn;
            XmlADOQuery.SQL.Clear;
            XmlADOQuery.SQL.Add(SqlStr);
            try
                XmlADOQuery.Active := True;
            except
                Result := -200; //执行sql语句出错
                exit;
            end;
            try
                XmlADOQuery.SaveToFile(xmlFileName,pfXML);
            except
                Result := -300; //保存文件出错
                exit;
            end;
            XmlADOQuery.Active := False;        //创建TXmlHelper对象
            EditXMLDoc := TXmlHelper.Create;
            //载入文件
            if EditXMLDoc.LoadXML(xmlFileName,FromLocalFile) = false then
            begin
                Result := -400; //打开XML文件出错
                exit;
            end
            else
            begin
                FirstNode := EditXMLDoc.RootNode;            //数据表名rs:basetable
                TableName := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType'].ChildNodes.Nodes['s:AttributeType'].Attributes['rs:basetable'];
                fieldNum := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType'].ChildNodes.Count;
                //主键字段
                PrimKeySQL := '';
                AllFieldName := '';            //添加根节点的节点,记录字段类型
                for i := 0 to fieldNum - 2 do
                begin
                    ElementNode := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType'].ChildNodes.Nodes[i];
                    FieldName := ElementNode.Attributes['name'];
                    //自动增长字段不处理
                    //If not (ElementNode.Attributes['rs:autoincrement']='true') Then
                    If ElementNode.Attributes['rs:autoincrement'] = Null Then
                    begin
                        If Length(AllFieldName) = 0 Then
                            AllFieldName := AllFieldName + FieldName
                        Else
                            AllFieldName := AllFieldName + '|' + FieldName;
                        FieldDataType := ElementNode.ChildNodes.Nodes['s:datatype'].Attributes['dt:type'];
                        //添加节点
                        ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'],FieldName,Decrypt(FieldDataType));
                        //取主键字段名
                        If (ElementNode.Attributes['rs:keycolumn']='true') Then
                            If Length(PrimKeySQL) = 0 Then
                                PrimKeySQL := PrimKeySQL + FieldName
                            Else
                                PrimKeySQL := PrimKeySQL + '|' + FieldName;
                    end;
                end;            //添加节点
                ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'], 'AllFieldName',Decrypt(AllFieldName));
                ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'], 'PrimKey',Decrypt(PrimKeySQL));
                ADDNode := EditXMLDoc.CreateNodeElement(FirstNode.ChildNodes.Nodes['s:Schema'], 'TableName',Decrypt(TableName));
                //function TXmlHelper.DeleteNodeElement(targetNode: IXmlNode): Boolean;
                //删除 s:ElementType 节点
                ScheamNode := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:ElementType'];            if EditXMLDoc.DeleteNodeElement(ScheamNode) = true then
                    EditXMLDoc.SaveToFile(xmlFileName)
                else
                begin
                    XmlADOQuery.Free; //释放对象
                    EditXMLDoc.Free;
                    //删除文件
                    if FileExists(xmlFileName) then
                        DeleteFile(xmlFileName);                result := -500; //XML文件增删节点错误
                    exit;
                end;
            end;        result := 1;
        Except        result := 0;
        End;
        //释放对象
        If EditXMLDoc <> nil Then
            EditXMLDoc.Free;
        If XmlADOQuery <> nil Then
            XmlADOQuery.Free;
    end;
      

  2.   

    function TASPCOMa.UseKeyXML(const DataFileName,
      InSertTemp: WideString): SYSINT;
    var
        useDataFileName: string;
        ArrayDataFileName: Array of String;
        XmlADOQuery: TADOQuery;
        AXXMLdoc: TXmlHelper;//TXmlHelper对象
        TableName, AllFieldName, PrimKey: WideString;//数据表名,全部字段名,主键字段名
        FirstNode: IXmlNode;
        DataNode, rsDataNode: IXmlNode;//影射文件节点、数据文件节点    fieldNum: Integer;//字段个数(s:ElementType的节点)    fieldArray: Array of String;  //字段名数组
        sqlKeyArray: Array of String; //主键字段数据
        ElementNode: IXMLNode;        //s:ElementType的节点
        i, j, k, iFile: integer;   //循环变量    InSertSQL, ValuesSQL, DeleteSQL: string;
        InSertSQL_Len, ValuesSQL_Len, DeleteSQL_Len: integer;
        UpValue, SchemaNodeValue: String;
    begin
        Try
            //创建TXmlHelper对象
            AXXMLdoc := TXmlHelper.Create;
            //创建对象
            XmlADOQuery := TADOQuery.Create(nil);        XmlADOQuery.Connection := ADOConn;        useDataFileName := DataFileName;
            while pos('*',useDataFileName) > 0 do
            begin
                i := Length(ArrayDataFileName);
                SetLength(ArrayDataFileName,i+1);
                ArrayDataFileName[i] := copy(useDataFileName,1,pos('*',useDataFileName));
                ArrayDataFileName[i] := copy(ArrayDataFileName[i],1,length(ArrayDataFileName[i])-1);
                useDataFileName := copy(useDataFileName,pos('*',useDataFileName)+1,Length(useDataFileName)-pos('*',useDataFileName)+1);
            end;
            i := Length(ArrayDataFileName);
            SetLength(ArrayDataFileName,i+1);
            ArrayDataFileName[i] := useDataFileName;        for iFile := 0 to Length(ArrayDataFileName) - 1 do
            begin
                //载入文件
                try
                    AXXMLdoc.LoadXML(ArrayDataFileName[iFile],FromLocalFile);
                except
                    CommitFlag := 0;                Result := -600; //打开XML文件出错
                    exit;
                end;            FirstNode := AXXMLdoc.RootNode;
                //数据表名rs:basetable  //字符串转换、解密
                If InSertTemp = 'Temp' Then
                    TableName := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:TableName'].NodeValue)) + 'temp'
                Else
                    TableName := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:TableName'].NodeValue));
                AllFieldName := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:AllFieldName'].NodeValue));
                fieldArray := nil;
                while pos('|',AllFieldName) > 0 do
                begin
                    i := Length(fieldArray);
                    SetLength(fieldArray,i+1);
                    fieldArray[i] := copy(AllFieldName,1,pos('|',AllFieldName));
                    fieldArray[i] := copy(fieldArray[i],1,length(fieldArray[i])-1);
                    AllFieldName := copy(AllFieldName,pos('|',AllFieldName)+1,Length(AllFieldName)-pos('|',AllFieldName)+1);
                end;
                i := Length(fieldArray);
                SetLength(fieldArray,i+1);
                fieldArray[i] := AllFieldName;
                if FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:PrimKey'].NodeValue <> null then
                begin
                    PrimKey := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:PrimKey'].NodeValue));
                    sqlKeyArray := nil;
                    while pos('|',PrimKey) > 0 do
                    begin
                        i := Length(sqlKeyArray);
                        SetLength(sqlKeyArray,i+1);
                        sqlKeyArray[i] := copy(PrimKey,1,pos('|',PrimKey));
                        sqlKeyArray[i] := copy(sqlKeyArray[i],1,length(sqlKeyArray[i])-1);
                        PrimKey := copy(PrimKey,pos('|',PrimKey)+1,Length(PrimKey)-pos('|',PrimKey)+1);
                    end;
                    i := Length(sqlKeyArray);
                    SetLength(sqlKeyArray,i+1);
                    sqlKeyArray[i] := PrimKey;
                end;
      

  3.   

    DataNode := AXXMLdoc.GetFirstChildXmlNode(FirstNode,'rs:data');
                fieldNum := FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Count;            for j:=0 to DataNode.ChildNodes.Count - 1 do
                begin
                    //SQL语句初始化
                    InSertSQL := 'insert into ' + TableName + '(';
                    ValuesSQL := ' values(';
                    DeleteSQL := 'delete from ' + TableName + ' where ';
                    InSertSQL_Len := Length(InSertSQL);
                    ValuesSQL_Len := Length(ValuesSQL);
                    DeleteSQL_Len := Length(DeleteSQL);                rsDataNode := DataNode.ChildNodes.Nodes[j];                for i:=0 to fieldNum - 4 do
                    begin
                        UpValue := Decode(AXXMLdoc.GetAttributeValue(rsDataNode,fieldArray[i]));                    if UpValue <> '' then
                        begin
                            SchemaNodeValue := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:'+fieldArray[i]].NodeValue));
                            //判断字段类型
                            if SchemaNodeValue = 'dateTime' then
                                //'2003-10-31T16:46:03.530000000',2004-01-17T09:13:10.620000000
                                UpValue := chr(39) + StringReplace(Copy(UpValue,1,23), 'T', ' ', [rfReplaceAll]) + chr(39)
                            else if (SchemaNodeValue = 'boolean') And (UpValue = 'True') then
                                UpValue := '1'
                            else if (SchemaNodeValue = 'boolean') And (UpValue = 'False') then
                                UpValue := '0'
                            else if (SchemaNodeValue='bin.hex') or (SchemaNodeValue='string') then
                                UpValue := chr(39) + UpValue + chr(39)
                            else
                                UpValue := UpValue;
                            //else if (SchemaNodeValue='i8') or (SchemaNodeValue='number') or (SchemaNodeValue='float')
                                //or (SchemaNodeValue='int') or (SchemaNodeValue='r4') or (SchemaNodeValue='i2') or or (SchemaNodeValue='ui1') then
                            If Length(InSertSQL) = InSertSQL_Len Then
                                InSertSQL := InSertSQL + fieldArray[i]
                            Else
                                InSertSQL := InSertSQL + ',' + fieldArray[i];
                            If Length(ValuesSQL) = ValuesSQL_Len Then
                                ValuesSQL := ValuesSQL + UpValue
                            Else
                                ValuesSQL := ValuesSQL + ',' + UpValue;
                            //删除主键相同的语句
                            if Length(sqlKeyArray) > 0 then
                                for k := 0 to Length(sqlKeyArray) - 1 do
                                begin
                                    If sqlKeyArray[k] = fieldArray[i] then
                                        If Length(DeleteSQL) = DeleteSQL_Len Then
                                            DeleteSQL := DeleteSQL + fieldArray[i] + '=' + UpValue
                                        Else
                                            DeleteSQL := DeleteSQL + ' and ' + fieldArray[i] + '=' + UpValue;
                                end;
                        end  //if UpValue <> ''
                        //********************************************************//
                        //***处理数据表中允许空的字段,这里把原来的NULL值赋值***//
                        //***dateTime:900-01-01 00:00:00
                        //***boolean:0
                        //***
                        else
                        begin
                            SchemaNodeValue := Encrypt(Decode(FirstNode.ChildNodes.Nodes['s:Schema'].ChildNodes.Nodes['s:'+fieldArray[i]].NodeValue));
                            //判断字段类型
                            if SchemaNodeValue = 'dateTime' then
                                UpValue := chr(39) + '1900-01-01 00:00:00' + chr(39)
                            else if (SchemaNodeValue = 'boolean') then
                                UpValue := '0'
                            else
                                UpValue := UpValue;
                            If Length(InSertSQL) = InSertSQL_Len Then
                                InSertSQL := InSertSQL + fieldArray[i]
                            Else
                                InSertSQL := InSertSQL + ',' + fieldArray[i];
                            If Length(ValuesSQL) = ValuesSQL_Len Then
                                ValuesSQL := ValuesSQL + UpValue
                            Else
                                ValuesSQL := ValuesSQL + ',' + UpValue;
                            //删除主键相同的语句
                            if Length(sqlKeyArray) > 0 then
                                for k := 0 to Length(sqlKeyArray) - 1 do
                                begin
                                    If sqlKeyArray[k] = fieldArray[i] then
                                        If Length(DeleteSQL) = DeleteSQL_Len Then
                                            DeleteSQL := DeleteSQL + fieldArray[i] + '=' + UpValue
                                        Else
                                            DeleteSQL := DeleteSQL + ' and ' + fieldArray[i] + '=' + UpValue;
                                end;
                        end;  //if UpValue <> '' else
                    end;  //for i:=0 to fieldNum - 4 do
                    //删除主键相同的数据
                    if DeleteSQL_Len <> Length(DeleteSQL) Then
                    begin
                        XmlADOQuery.SQL.Clear;
                        XmlADOQuery.SQL.Add(DeleteSQL);
                        try
                            XmlADOQuery.ExecSQL;
                        except
                            CommitFlag := 0;
                            Result := -650;
                            exit;
                        end;
                    end;
                    //数据处理--把数据插入目标数据表中
                    InSertSQL := InSertSQL + ')' + ValuesSQL + ')';
                    XmlADOQuery.SQL.Clear;
                    XmlADOQuery.SQL.Add(InSertSQL);
                    try
                        XmlADOQuery.ExecSQL;
                    except
                        CommitFlag := 0;
                        Result := -700;
                        exit;
                    end;
                end;//for j:=0 to DataNode.ChildNodes.Count - 1 do
            end;//for iFile := 0 to Length(ArrayDataFileName) - 1 do        If ADOConn.Errors.Count <> 0 Then
            begin
                CommitFlag := 0;
                Result := -1;
                exit;
            end;        Result := 1;
        Except
            CommitFlag := 0;        Result := 0;
        End;    //释放对象
        If AXXMLdoc <> nil Then
            AXXMLdoc.Free;
        If XmlADOQuery <> nil Then
            XmlADOQuery.Free;
    end;
      

  4.   

    我感觉你在一般的form里使用,然后将其转化成active form不就成了!
      

  5.   

    我现在有一个现成的xml文件,不用重新生成.这个是:TXmlHelper我怎么没找到呢?
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ClientDataSet1 do
      begin
        FileName := 'C:\...\exp1.xml';
        Open;
        Append;
        FieldValues['ID'] := Edit1.Text;
        {...}
        Post;
      end;
    end;(注:用TClientDataSet控件、試試能不能打開现成的xml文件)
      

  7.   

    如果要txmlhelper,我以前写过一个,还不错,我一直在用它,如果要的话可以发给你们