| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | unit ReportInteractInfo;interfaceuses  Classes, ScFileArchiver, XmlDoc, XmlIntf;Type  TInteractInfo = class  private    FTemplateFile: string;    FInteractFlag: Integer;    FInteractSubFlag: Integer;    FMemoryStream: TMemoryStream;    FAudits: TStringList;    FSql: string;    FSpecialProjGatherTypes: TStringList;    procedure LoadReportTemplate;    procedure LoadAuditor(AXmlNode: IXMLNode);    procedure LoadSql(AXmlNode: IXMLNode);    procedure LoadSpecialProjGatherTypes(AXmlNode: IXMLNode);    procedure LoadInteractInfo(AXmlNode: IXMLNode);  public    constructor Create(const AFileName: string);    destructor Destroy; override;    procedure LoadXmlFromStream;    property Audits: TStringList read FAudits;    property Sql: string read FSql;    property SpecialProjGatherTypes: TStringList read FSpecialProjGatherTypes;  end;implementationuses  UtilMethods;{ TInteractInfo }constructor TInteractInfo.Create(const AFileName: string);begin  FTemplateFile := AFileName;  FAudits := TStringList.Create;  FSpecialProjGatherTypes := TStringList.Create;  LoadReportTemplate;  LoadXmlFromStream;end;destructor TInteractInfo.Destroy;begin  FMemoryStream.Free;  inherited;end;procedure TInteractInfo.LoadAuditor(AXmlNode: IXMLNode);var  vAudits: IXMLNodeList;  vAudit: IXMLNode;  i: Integer;begin  if AXmlNode = nil then Exit;  FAudits.Clear;  vAudits := AXmlNode.ChildNodes;  for i := 0 to vAudits.Count - 1 do  begin    vAudit := AXmlNode.ChildNodes.Nodes[i];    if vAudit.HasAttribute('职位') then      FAudits.Add(vAudit.Attributes['职位']);  end;end;procedure TInteractInfo.LoadInteractInfo(AXmlNode: IXMLNode);var  XmlNode: IXMLNode;begin  XmlNode := AXmlNode.ChildNodes.FindNode('附加信息');  LoadAuditor(XmlNode.ChildNodes.FindNode('审核意见'));  LoadSql(XmlNode.ChildNodes.FindNode('查询语句'));  LoadSpecialProjGatherTypes(XmlNode.ChildNodes.FindNode('特殊汇总项目'));end;procedure TInteractInfo.LoadReportTemplate;var  vArchiver: TReportArchiver;begin  vArchiver := TReportArchiver.Create;  vArchiver.FileName := FTemplateFile;  FMemoryStream := vArchiver.Extract;end;procedure TInteractInfo.LoadSpecialProjGatherTypes(AXmlNode: IXMLNode);var  vSpecialProjs: IXMLNodeList;  vSpecialProj: IXMLNode;  i: Integer;begin  if AXmlNode = nil then Exit;  FSpecialProjGatherTypes.Clear;  vSpecialProjs := AXmlNode.ChildNodes;  for i := 0 to vSpecialProjs.Count - 1 do  begin    vSpecialProj := vSpecialProjs.Nodes[i];    if vSpecialProj.HasAttribute('类型') then      FSpecialProjGatherTypes.Add(vSpecialProj.Attributes['类型']);  end;end;procedure TInteractInfo.LoadSql(AXmlNode: IXMLNode);begin  if AXmlNode = nil then Exit;  if AXmlNode.HasAttribute('Sql语句') then    FSql := AXmlNode.Attributes['Sql语句'];end;procedure TInteractInfo.LoadXmlFromStream;var  FXmlDocument: IXMLDocument;begin  FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;  try    FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];    if not Assigned(FMemoryStream) then Exit;    FXmlDocument.LoadFromStream(FMemoryStream);    LoadInteractInfo(FXmlDocument.DocumentElement);  finally    FXmlDocument := nil;  end;end;end.
 |