⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcledixml.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{**************************************************************************************************}
{                                                                                                  }
{ Project JEDI Code Library (JCL)                                                                  }
{                                                                                                  }
{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); }
{ you may not use this file except in compliance with the License. You may obtain a copy of the    }
{ License at http://www.mozilla.org/MPL/                                                           }
{                                                                                                  }
{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF   }
{ ANY KIND, either express or implied. See the License for the specific language governing rights  }
{ and limitations under the License.                                                               }
{                                                                                                  }
{ The Original Code is JclEDIXML.pas.                                                              }
{                                                                                                  }
{ The Initial Developer of the Original Code is Raymond Alexander.                                 }
{ Portions created by Raymond Alexander are Copyright (C) Raymond Alexander. All rights reserved.  }
{                                                                                                  }
{ Contributor(s):                                                                                  }
{   Raymond Alexander (rayspostbox3), Robert Marquardt, Robert Rossmair, Petr Vones                }
{                                                                                                  }
{**************************************************************************************************}
{                                                                                                  }
{ A complementary unit to JclEDI.pas.                                                              }
{                                                                                                  }
{ Unit owner: Raymond Alexander                                                                    }
{ Date created: March 6, 2003                                                                      }
{ Additional Info:                                                                                 }
{   E-Mail at RaysDelphiBox3 att hotmail dott com                                                  }
{   For latest EDI specific demos see http://sourceforge.net/projects/edisdk                       }
{   See home page for latest news & events and online help.                                        }
{                                                                                                  }
{**************************************************************************************************}
{                                                                                                  }
{ 04/21/2003 (R.A.)                                                                                }
{                                                                                                  }
{   The current status of this unit is experimental.                                               }
{                                                                                                  }
{**************************************************************************************************}

// $Id: JclEDIXML.pas,v 1.13 2005/03/08 08:33:16 marquardt Exp $

unit JclEDIXML;

{$I jcl.inc}

{$IFDEF SUPPORTS_WEAKPACKAGEUNIT}
  {$WEAKPACKAGEUNIT ON}
{$ENDIF SUPPORTS_WEAKPACKAGEUNIT}

interface

uses
  SysUtils, Classes,
  JclEDI, JclEDI_ANSIX12;

const
  XMLTag_Element = 'Element';
  XMLTag_Segment = 'Segment';
  XMLTag_TransactionSetLoop = 'Loop';
  XMLTag_TransactionSet = 'TransactionSet';
  XMLTag_FunctionalGroup = 'FunctionalGroup';
  XMLTag_InterchangeControl = 'InterchangeControl';
  XMLTag_EDIFile = 'EDIFile';
  XMLTag_ICHSegmentId = ICHSegmentId; // Interchange Control Header Segment Id
  XMLTag_ICTSegmentId = ICTSegmentId; // Interchange Control Trailer Segment Id
  XMLTag_FGHSegmentId = FGHSegmentId; // Functional Group Header Segment Id
  XMLTag_FGTSegmentId = FGTSegmentId; // Functional Group Trailer Segment Id
  XMLTag_TSHSegmentId = TSHSegmentId; // Transaction Set Header Segment Id
  XMLTag_TSTSegmentId = TSTSegmentId; // Transaction Set Trailer Segment Id
  XMLAttribute_Id = 'Id';
  XMLAttribute_Position = 'Position';
  XMLAttribute_Description = 'Description';
  XMLAttribute_RequirementDesignator = 'RequirementDesignator';
  XMLAttribute_Type = 'Type';
  XMLAttribute_MinimumLength = 'MinimumLength';
  XMLAttribute_MaximumLength = 'MaximumLength';
  XMLAttribute_Section = 'Section';
  XMLAttribute_MaximumUsage = 'MaximumUsage';
  XMLAttribute_OwnerLoopId = 'OwnerLoopId';
  XMLAttribute_ParentLoopId = 'ParentLoopId';

type
  //  EDI Forward Class Declarations
  TEDIXMLObject = class(TEDIObject);
  TEDIXMLDataObject = class;
  TEDIXMLElement = class;
  TEDIXMLSegment = class;
  TEDIXMLTransactionSet = class;
  TEDIXMLFunctionalGroup = class;
  TEDIXMLInterchangeControl = class;
  TEDIXMLFile = class;

  //  EDI Delimiters Object
  TEDIXMLDelimiters = class(TEDIXMLObject)
  private
    FBeginTagDelimiter: string;
    FEndTagDelimiter: string;
    FBeginTagLength: Integer;
    FEndTagLength: Integer;
    FBeginCDataDelimiter: string;
    FEndCDataDelimiter: string;
    FBeginCDataLength: Integer;
    FEndCDataLength: Integer;
    FBeginOfEndTagDelimiter: string;
    FBeginOfEndTagLength: Integer;
    //Special Delimiters for Attributes
    FSpaceDelimiter: string;
    FAssignmentDelimiter: string;
    FSingleQuote: string;
    FDoubleQuote: string;
    procedure SetBeginTagDelimiter(const Value: string);
    procedure SetEndTagDelimiter(const Value: string);
    procedure SetBeginCDataDelimiter(const Value: string);
    procedure SetEndCDataDelimiter(const Value: string);
    procedure SetBeginOfEndTagDelimiter(const Value: string);
  public
    constructor Create;
  published
    property BTD: string read FBeginTagDelimiter write SetBeginTagDelimiter;
    property ETD: string read FEndTagDelimiter write SetEndTagDelimiter;
    property BTDLength: Integer read FBeginTagLength;
    property ETDLength: Integer read FEndTagLength;
    property BOfETD: string read FBeginOfEndTagDelimiter write SetBeginOfEndTagDelimiter;
    property BOfETDLength: Integer read FBeginOfEndTagLength;
    property BCDataD: string read FBeginCDataDelimiter write SetBeginCDataDelimiter;
    property ECDataD: string read FEndCDataDelimiter write SetEndCDataDelimiter;
    property BCDataLength: Integer read FBeginCDataLength;
    property ECDataLength: Integer read FEndCDataLength;
    //Special Delimiters for Attributes
    property SpaceDelimiter: string read FSpaceDelimiter write FSpaceDelimiter;
    property AssignmentDelimiter: string read FAssignmentDelimiter write FAssignmentDelimiter;
    property SingleQuote: string read FSingleQuote write FSingleQuote;
    property DoubleQuote: string read FDoubleQuote write FDoubleQuote;
  end;

  //  EDI XML Attributes
  TEDIXMLAttributes = class(TEDIXMLObject)
  private
    FAttributes: TStringList;
    FDelimiters: TEDIXMLDelimiters;
  public
    constructor Create;
    destructor Destroy; override;
    procedure ParseAttributes(XMLStartTag: string);
    function CombineAttributes: string;
    procedure SetAttribute(Name, Value: string);
    function CheckAttribute(Name, Value: string): Integer;
    function GetAttributeValue(Name: string): string;
    function GetAttributeString(Name: string): string;
  end;

  //  EDI Data Object
  TEDIXMLObjectArray = array of TEDIXMLObject;

  TEDIXMLDataObject = class(TEDIXMLObject)
  private
    procedure SetDelimiters(const Delimiters: TEDIXMLDelimiters);
  protected
    FEDIDOT: TEDIDataObjectType;
    FState: TEDIDataObjectDataState;
    FData: string;
    FLength: Integer;
    FParent: TEDIXMLDataObject;
    FDelimiters: TEDIXMLDelimiters;
    FAttributes: TEDIXMLAttributes;
    FErrorLog: TStrings;
    FSpecPointer: Pointer;
    FCustomData1: Pointer;
    FCustomData2: Pointer;
    function GetData: string;
    procedure SetData(const Data: string);
    function Assemble: string; virtual; abstract;
    procedure Disassemble; virtual; abstract;
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce;
    destructor Destroy; override;
    property SpecPointer: Pointer read FSpecPointer write FSpecPointer;
    property CustomData1: Pointer read FCustomData1 write FCustomData1;
    property CustomData2: Pointer read FCustomData2 write FCustomData2;
  published
    property State: TEDIDataObjectDataState read FState;
    property Data: string read GetData write SetData;
    property DataLength: Integer read FLength;
    property Parent: TEDIXMLDataObject read FParent write FParent;
    property Delimiters: TEDIXMLDelimiters read FDelimiters write SetDelimiters;
    property Attributes: TEDIXMLAttributes read FAttributes write FAttributes;
  end;

  TEDIXMLDataObjectArray = array of TEDIXMLDataObject;

  //  EDI Element
  TEDIXMLElement = class(TEDIXMLDataObject)
    FCData: Boolean;
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce;
    function InternalAssignDelimiters: TEDIXMLDelimiters; virtual;
    function Assemble: string; override;
    procedure Disassemble; override;
    function GetIndexPositionFromParent: Integer;
  published
    property CData: Boolean read FCData write FCData;
  end;

  TEDIXMLElementArray = array of TEDIXMLElement;

  //  EDI Data Object Group
  TEDIXMLDataObjectGroup = class(TEDIXMLDataObject)
  protected
    FEDIDataObjects: TEDIXMLDataObjectArray;
    function GetEDIDataObject(Index: Integer): TEDIXMLDataObject;
    procedure SetEDIDataObject(Index: Integer; EDIDataObject: TEDIXMLDataObject);
    function InternalAssignDelimiters: TEDIXMLDelimiters; virtual; abstract;
    function InternalCreateDataObjectGroup: TEDIXMLDataObjectGroup; virtual; abstract;
    function SearchForSegmentInDataString(Id: string; StartPos: Integer): Integer;
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce;
    destructor Destroy; override;
    //
    //  ToDo:  More procedures and functions to manage internal structures
    //
    function AppendEDIDataObject(EDIDataObject: TEDIXMLDataObject): Integer;
    function InsertEDIDataObject(InsertIndex: Integer; EDIDataObject: TEDIXMLDataObject): Integer;
    procedure DeleteEDIDataObject(Index: Integer); overload;
    procedure DeleteEDIDataObject(EDIDataObject: TEDIXMLDataObject); overload;
    //
    function AddSegment: Integer;
    function InsertSegment(InsertIndex: Integer): Integer;
    //
    function AddGroup: Integer; virtual;
    function InsertGroup(InsertIndex: Integer): Integer; virtual;
    //
    procedure DeleteEDIDataObjects;
    property EDIDataObject[Index: Integer]: TEDIXMLDataObject read GetEDIDataObject
    write SetEDIDataObject; default;
    property EDIDataObjects: TEDIXMLDataObjectArray read FEDIDataObjects write FEDIDataObjects;
  end;

  //  EDI Segment Classes
  TEDIXMLSegment = class(TEDIXMLDataObject)
  private
    FSegmentID: string;
    FElements: TEDIXMLElementArray;
    function GetElement(Index: Integer): TEDIXMLElement;
    procedure SetElement(Index: Integer; Element: TEDIXMLElement);
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce; overload;
    constructor Create(Parent: TEDIXMLDataObject; ElementCount: Integer); reintroduce; overload;
    destructor Destroy; override;
    //
    function InternalAssignDelimiters: TEDIXMLDelimiters; virtual;
    function InternalCreateElement: TEDIXMLElement; virtual;
    //
    function AddElement: Integer;
    function AppendElement(Element: TEDIXMLElement): Integer;
    function InsertElement(InsertIndex: Integer): Integer; overload;
    function InsertElement(InsertIndex: Integer; Element: TEDIXMLElement): Integer; overload;
    procedure DeleteElement(Index: Integer); overload;
    procedure DeleteElement(Element: TEDIXMLElement); overload;
    //
    function AddElements(Count: Integer): Integer;
    function AppendElements(ElementArray: TEDIXMLElementArray): Integer;
    function InsertElements(InsertIndex, Count: Integer): Integer; overload;
    function InsertElements(InsertIndex: Integer;
      ElementArray: TEDIXMLElementArray): Integer; overload;
    procedure DeleteElements; overload;
    procedure DeleteElements(Index, Count: Integer); overload;
    //
    function Assemble: string; override;
    procedure Disassemble; override;
    function GetIndexPositionFromParent: Integer;
    property Element[Index: Integer]: TEDIXMLElement read GetElement write SetElement; default;
    property Elements: TEDIXMLElementArray read FElements write FElements;
  published
    property SegmentID: string read FSegmentID write FSegmentID;
  end;

  TEDIXMLSegmentArray = array of TEDIXMLSegment;  

  TEDIXMLTransactionSetSegment = class(TEDIXMLSegment)
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce; overload;
    constructor Create(Parent: TEDIXMLDataObject; ElementCount: Integer); reintroduce; overload;
    function InternalAssignDelimiters: TEDIXMLDelimiters; override;
  end;

  TEDIXMLFunctionalGroupSegment = class(TEDIXMLSegment)
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce; overload;
    constructor Create(Parent: TEDIXMLDataObject; ElementCount: Integer); reintroduce; overload;
    function InternalAssignDelimiters: TEDIXMLDelimiters; override;
  end;

  TEDIXMLInterchangeControlSegment = class(TEDIXMLSegment)
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce; overload;
    constructor Create(Parent: TEDIXMLDataObject; ElementCount: Integer); reintroduce; overload;
    function InternalAssignDelimiters: TEDIXMLDelimiters; override;
  end;

  //  EDI Transaction Set Loop
  TEDIXMLTransactionSetLoop = class(TEDIXMLDataObjectGroup)
  private
    FParentTransactionSet: TEDIXMLTransactionSet;
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce;
    destructor Destroy; override;
    function InternalAssignDelimiters: TEDIXMLDelimiters; override;
    function InternalCreateDataObjectGroup: TEDIXMLDataObjectGroup; override;
    function Assemble: string; override;
    procedure Disassemble; override;
  published
    property ParentTransactionSet: TEDIXMLTransactionSet read FParentTransactionSet
      write FParentTransactionSet;
  end;

  //  EDI Transaction Set
  TEDIXMLTransactionSet = class(TEDIXMLTransactionSetLoop)
  private
    FSTSegment: TEDIXMLSegment;
    FSESegment: TEDIXMLSegment;
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce;
    destructor Destroy; override;
    function InternalAssignDelimiters: TEDIXMLDelimiters; override;
    function InternalCreateDataObjectGroup: TEDIXMLDataObjectGroup; override;
    function Assemble: string; override;
    procedure Disassemble; override;
  published
    property SegmentST: TEDIXMLSegment read FSTSegment write FSTSegment;
    property SegmentSE: TEDIXMLSegment read FSESegment write FSESegment;
  end;

  //  EDI Functional Group
  TEDIXMLFunctionalGroup = class(TEDIXMLDataObjectGroup)
  private
    FGSSegment: TEDIXMLSegment;
    FGESegment: TEDIXMLSegment;
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce;
    destructor Destroy; override;
    function InternalAssignDelimiters: TEDIXMLDelimiters; override;
    function InternalCreateDataObjectGroup: TEDIXMLDataObjectGroup; override;
    function Assemble: string; override;
    procedure Disassemble; override;
  published
    property SegmentGS: TEDIXMLSegment read FGSSegment write FGSSegment;
    property SegmentGE: TEDIXMLSegment read FGESegment write FGESegment;
  end;

  //  EDI Interchange Control
  TEDIXMLInterchangeControl = class(TEDIXMLDataObjectGroup)
  private
    FISASegment: TEDIXMLSegment;
    FIEASegment: TEDIXMLSegment;
  public
    constructor Create(Parent: TEDIXMLDataObject); reintroduce;
    destructor Destroy; override;
    function InternalAssignDelimiters: TEDIXMLDelimiters; override;
    function InternalCreateDataObjectGroup: TEDIXMLDataObjectGroup; override;
    function Assemble: string; override;
    procedure Disassemble; override;
  published
    property SegmentISA: TEDIXMLSegment read FISASegment write FISASegment;
    property SegmentIEA: TEDIXMLSegment read FIEASegment write FIEASegment;
  end;

  //  EDI XML File Header
  TEDIXMLNameSpaceOption = (nsNone, nsDefault, nsQualified);

  TEDIXMLFileHeader = class(TEDIXMLObject)
  private
    FDelimiters: TEDIXMLDelimiters;
    FAttributes: TEDIXMLAttributes;
    FXMLNameSpaceOption: TEDIXMLNameSpaceOption;
  protected
    function OutputAdditionalXMLHeaderAttributes: string; virtual;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -