adoquery中有字段id,the_date,worker,spid分别对应xml文件中的ToCorpID,ActDate,Actor,Code
如何导出下面格式的xml文件?用adoquery1.SaveToFile无法生成合适的格式,还有没有其他的办法呢。
<?xml version="1.0" encoding="UTF-8"?>
<Document Version="3.0" xsi:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Events>
<Event MainAction="WareHouseOut" Name="DestoryWareHouseOut">
<DataField>
<Data ToCorpID="" ActDate="2013-06-27 21:11:11" Actor="1111" Code="665"/>
</DataField>
</Event>
</Events>
</Document>

解决方案 »

  1.   

    xml即文本格式。通过txt手工文本编写。想导出什么就可导出什么。
      

  2.   

    推荐控件:NativeXML,非常实用!
      

  3.   

    NativeXML
      

  4.   

    这不是控件,直接uses单元就行,不用安装
      

  5.   

    顶一下,这个问题很难吗?第一次接触xml文件
      

  6.   

    懒人是编不了程序的!这个非常的简单,特给你编写一个.
    uses
      ...., XMLDoc, XMLIntf, ADODB;....procedure TfrmTestXML.btnToXmlFileClick(Sender: TObject);
    const
      ct_root = 'Document';
      ct_child1 = 'Events';
      ct_child2 = 'Event';
      ct_child3 = 'DataField';
      ct_child4 = 'Data';
      ct_xmlFileName = 'd:\xml\DataTableToXMLFile.xml';
    var
      temxml: TXMLDocument;
      temnode, newxmlnode, rootnode: IXMLnode;
      adoquery1: TAdoquery;
    begin
      adoquery1 := TAdoquery.Create(application);
      adoquery1.SQL.Add('select id,the_date,worker,spid from dataTable');
      adoquery1.Open;
      temxml := TXMLDocument.Create(self);
      temxml.Active := true;
      temxml.Version := '1.0';
      temxml.Encoding := 'UTF-8';
      rootnode := temxml.AddChild(ct_root);
      rootnode.SetAttribute('Version', '3.0...');
      newxmlnode := rootnode.AddChild(ct_child1);
      newxmlnode := newxmlnode.AddChild(ct_child2);
      newxmlnode.SetAttribute('MainAction', 'WareHouseOut..');
      newxmlnode := newxmlnode.AddChild(ct_child3);
      adoquery1.First;
      while Not adoquery1.eof do
        begin
          temnode := newxmlnode.AddChild(ct_child4);
          temnode.SetAttribute('ToCorpID', adoquery1.FieldByName('id').AsString);
          temnode.SetAttribute('Actdate',  adoquery1.FieldByName('the_date').AsString);
          temnode.SetAttribute('Actor',  adoquery1.FieldByName('worker').AsString);
          temnode.SetAttribute('Code',  adoquery1.FieldByName('spid').AsString);
          adoquery1.Next;
        end;
      adoquery1.Close;
      adoquery1.Free;
      temxml.SaveToFile(ct_xmlFileName);
      temxml.Free;
    end;
      

  7.   

    to yjkita:
    您的方法果然可行,只是下面这两处地方不符合格式,如何处理?本人初学xml,望赐教。谢谢
    <Document Version="3.0" xsi:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Event MainAction="WareHouseOut" Name="DestoryWareHouseOut">
      

  8.   

    那两处我补充完整就是这样,你在两...之间全选并用以下代替.rootnode.SetAttribute('Version', '3.0');
    rootnode.SetAttribute('Vexsi:noNamespaceSchemaLocation', '终端接口XML Schema-3.0.xsd');
    rootnode.SetAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
    newxmlnode := rootnode.AddChild(ct_child1);   
    newxmlnode := newxmlnode.AddChild(ct_child2);   
    newxmlnode.SetAttribute('MainAction', 'WareHouseOut');
    newxmlnode.SetAttribute('Name', 'DestoryWareHouseOut');
      

  9.   

    to yjkita:
    按照您说的方法实现了,多谢。
    不过却发现个问题,它只会按下面的顺序排列,明明把Version="3.0"放到前面也不行。
    <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" Version="3.0">我想让按照下面顺序排列,不知道怎么处理?修改写入的顺序也无法实现.
    <Document Version="3.0" xsi:noNamespaceSchemaLocation="终端接口XML Schema-3.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      

  10.   

    to yjkita:按照下面写法,也是出现上面第一种的顺序,不知道什么原因?
      temxml.Version := '1.0';
      temxml.Encoding := 'UTF-8';
      rootnode := temxml.AddChild(ct_root);
      rootnode.SetAttribute('Version', '3.0');
      rootnode.SetAttribute('xsi:noNamespaceSchemaLocation', '终端接口XML Schema-3.0.xsd');
      rootnode.SetAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
      newxmlnode := rootnode.AddChild(ct_child1);
      newxmlnode := newxmlnode.AddChild(ct_child2);
      newxmlnode.SetAttribute('MainAction', 'WareHouseOut');
      newxmlnode.SetAttribute('Name', 'DestoryWareHouseOut');
      newxmlnode := newxmlnode.AddChild(ct_child3);
      

  11.   

    找到原因了,感谢to yjkita