function GetTaskTmpList(out pmsg, pResultFileName: string; pOption: integer; pTmpVersion: string):
  boolean;
var
  vResult, vFind: boolean;
  vXMLFile: TXMLDocument;
  vRoot, vChild: IXMLNode;
  i, j: integer;
  mTmpVersionList: TStringList;
  function GetTmpVersionList(out pMsg: string; out pList: TStringList; pTmpVersionFile: string):
      boolean;
  var
    vXMLTmpVersionFile: TXMLDocument;
    vRoot, vChild: IXMLNode;
    vRecord: TTmpVersion;
    i: integer;
    vResult: boolean;
  begin
    vResult := false;
    if not assigned(pList) then pList := TStringList.Create;
    pList.Clear;
    if FileExists(pTmpVersionFile) then
    begin
      vXMLTmpVersionFile := TXMLDocument.Create('');
      try
        vXMLTmpVersionFile.LoadFromFile(pTmpVersionFile);
        vXMLTmpVersionFile.Active := false;
        vXMLTmpVersionFile.Active := true;
        vRoot := vXMLTmpVersionFile.Node.ChildNodes.FindNode(XML_ROOT); //这里出错误!
        for I := 0 to vRoot.ChildNodes.Count - 1 do
        begin
          vChild := vRoot.ChildNodes.Nodes[i];
          vRecord := TTmpVersion.Create;
          vRecord.TmpId := vChild.Attributes[XML_ROW_ID];
          vRecord.TmpVersion := vChild.Attributes[XML_ROW_VERSION];
          pList.AddObject(vRecord.TmpId, vRecord);
        end;
        vResult := true;
      finally
        vXMLTmpVersionFile.free;
      end;
    end;
    Result := vResult;
  end;
begin
  vResult := false;
  with Dm.tbTmpList do
  begin
    try
      active := true;
      First;
      vXMLFile := TXMLDocument.Create('');
      vXMLFile.Active := true;
      vXMLFile.Encoding := 'UTF-8';
      vRoot := vXMLFile.Node.AddChild(XML_ROOT, -1);
      if pOption = 1 then
      begin
        mTmpVersionList := TStringList.Create;
        if not GetTmpVersionList(pMsg, mTmpVersionList, pTmpVersion) then vResult := false;
      end;
      i := 0;
      while not Eof do
      begin
        if pOption = 0 then
        begin
          //下载所有的最新的
          inc(i);
          vChild := vRoot.AddChild('Row' + inttostr(i), 0);
          vChild.Attributes[XML_ROW_ID] := FieldByName('TmpId').AsString;
          vChild.Attributes[XML_ROW_NAME] := FieldByName('TmpName').AsString;
          vChild.Attributes[XML_ROW_SIZE] := FieldByName('TmpSize').AsString;
          vChild.Attributes[XML_ROW_VERSION] := FieldByName('TmpVersion').AsString;
          vChild.Attributes[XML_ROW_DESP] := FieldByName('TmpDesp').AsString;
          vChild.Attributes[XML_ROW_UPDATETIME] := FieldByName('CrtrDate').AsString;
        end;
        if pOption = 1 then
        begin
          vFind := false;
          for j := 0 to mTmpVersionList.Count - 1 do
          begin
            if (trim((mTmpVersionList.Objects[j] as TTmpVersion).TmpId) =
              trim(FieldByName('TmpId').AsString)) then
            begin
              if strtoint(trim(FieldByName('TmpVersion').AsString)) <=
                strtoint(trim((mTmpVersionList.Objects[j] as TTmpVersion).TmpId)) then
              begin
                vFind := true;
                break;
              end;
            end;
          end;
          if not vFind then
          begin
            inc(i);
            vChild := vRoot.AddChild('Row' + inttostr(i), 0);
            vChild.Attributes[XML_ROW_ID] := FieldByName('TmpId').AsString;
            vChild.Attributes[XML_ROW_NAME] := FieldByName('TmpName').AsString;
            vChild.Attributes[XML_ROW_SIZE] := FieldByName('TmpSize').AsString;
            vChild.Attributes[XML_ROW_VERSION] := FieldByName('TmpVersion').AsString;
            vChild.Attributes[XML_ROW_DESP] := FieldByName('TmpDesp').AsString;
            vChild.Attributes[XML_ROW_UPDATETIME] := FieldByName('CrtrDate').AsString;
          end;
        end;
        next;
      end;
      if FileExists(mSystemConfig.DocDir + '\' + FILE_TEMPLIST) then
        DeleteFile(mSystemConfig.DocDir + '\' + FILE_TEMPLIST);
      vXMLFile.SaveToFile(mSystemConfig.DocDir + '\' + FILE_TEMPLIST);
      pResultFileName := mSystemConfig.DocDir + '\' + FILE_TEMPLIST;
      vResult := true;
    except
      on E: Exception do
        pmsg := E.Message;
    end;
  end;
  Result := vResult;
end;