📄 jcledixml.pas
字号:
{**************************************************************************************************}
{ }
{ 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 + -