📄 jcledixml.pas
字号:
else
FParentTransactionSet := nil;
FEDIDOT := ediLoop;
end;
destructor TEDIXMLTransactionSetLoop.Destroy;
begin
inherited Destroy;
end;
function TEDIXMLTransactionSetLoop.Assemble: string;
var
I: Integer;
AttributeString: string;
begin
FData := '';
FLength := 0;
Result := '';
if not Assigned(FDelimiters) then // Attempt to assign the delimiters
begin
FDelimiters := InternalAssignDelimiters;
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@EDIXMLError030);
end;
AttributeString := FAttributes.CombineAttributes;
if AttributeString <> '' then
FData := FDelimiters.BTD + XMLTag_TransactionSetLoop + FDelimiters.SpaceDelimiter +
AttributeString + FDelimiters.ETD
else
FData := FDelimiters.BTD + XMLTag_TransactionSetLoop + FDelimiters.ETD;
if Length(FEDIDataObjects) > 0 then
for I := Low(FEDIDataObjects) to High(FEDIDataObjects) do
if Assigned(FEDIDataObjects[I]) then
FData := FData + FEDIDataObjects[I].Assemble;
FData := FData + FDelimiters.BOfETD + XMLTag_TransactionSetLoop + FDelimiters.ETD;
FLength := Length(FData);
Result := FData; // Return assembled string
DeleteEDIDataObjects;
FState := ediAssembled;
end;
procedure TEDIXMLTransactionSetLoop.Disassemble;
var
I, J, StartPos, SearchResult: Integer;
XMLStartTag, SearchTag: string;
NestedLoopCount: Integer;
begin
DeleteEDIDataObjects;
// Check delimiter assignment
if not Assigned(FDelimiters) then
begin
FDelimiters := InternalAssignDelimiters;
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@EDIXMLError029);
end;
// Set next start positon
StartPos := 1;
// Move past begin loop tag
SearchResult := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
if SearchResult > 0 then
begin
StartPos := SearchResult;
SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
XMLStartTag := Copy(FData, StartPos, (SearchResult + FDelimiters.ETDLength) - StartPos);
FAttributes.ParseAttributes(XMLStartTag);
end
else
raise EJclEDIError.CreateRes(@EDIXMLError031);
// Set next start positon
StartPos := SearchResult + FDelimiters.ETDLength;
// Determine the nearest tag to search for
I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
if (I < J) or (J <= 0) then
begin
SearchTag := XMLTag_Segment;
SearchResult := I;
end
else
begin
SearchTag := XMLTag_TransactionSetLoop;
SearchResult := J;
end;
// Search for Segments or Loops
while SearchResult > 0 do
begin
if SearchTag = XMLTag_Segment then
begin
SearchResult := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult);
if SearchResult > 0 then
begin
SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
if SearchResult > 0 then
begin
I := AddSegment; // Add Segment
EDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
EDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@EDIXMLError045);
end
else
raise EJclEDIError.CreateRes(@EDIXMLError044);
end
else
begin
NestedLoopCount := 0;
SearchResult := StartPos;
// Search for the proper end loop tag
repeat
I := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult); //Find loop end
J := StrSearch(FDelimiters.BTD + SearchTag, FData, SearchResult); //Find loop begin
if (I < J) or (J <= 0) then
begin
Dec(NestedLoopCount);
SearchResult := I + FDelimiters.ETDLength;
end
else
if (I > J) and (J > 0) then
begin
Inc(NestedLoopCount);
SearchResult := J + FDelimiters.ETDLength;
end;
until (NestedLoopCount <= 0) or (I <= 0);
SearchResult := I;
//
if SearchResult > 0 then
begin
SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
if SearchResult > 0 then
begin
I := AddGroup; // Add Transaction Set Loop
EDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
EDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@EDIXMLError032);
end
else
raise EJclEDIError.CreateRes(@EDIXMLError031);
end;
// Set next start positon
StartPos := SearchResult + FDelimiters.ETDLength;
// Determine the nearest tag to search for
I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
if (I < J) or (J <= 0) then
SearchTag := XMLTag_Segment
else
SearchTag := XMLTag_TransactionSetLoop;
SearchResult := StrSearch(FDelimiters.BTD + SearchTag, FData, StartPos);
StartPos := SearchResult;
end;
FData := '';
//
FState := ediDisassembled;
end;
function TEDIXMLTransactionSetLoop.InternalAssignDelimiters: TEDIXMLDelimiters;
begin
Result := nil;
if Assigned(FParentTransactionSet) then
Result := Parent.Delimiters;
end;
function TEDIXMLTransactionSetLoop.InternalCreateDataObjectGroup: TEDIXMLDataObjectGroup;
begin
Result := TEDIXMLTransactionSetLoop.Create(Self);
end;
//=== { TEDIXMLTransactionSet } ==============================================
constructor TEDIXMLTransactionSet.Create(Parent: TEDIXMLDataObject);
begin
inherited Create(Parent);
FParentTransactionSet := Self;
FEDIDOT := ediTransactionSet;
end;
destructor TEDIXMLTransactionSet.Destroy;
begin
inherited Destroy;
end;
function TEDIXMLTransactionSet.Assemble: string;
var
I: Integer;
AttributeString: string;
begin
FData := '';
FLength := 0;
Result := '';
if not Assigned(FDelimiters) then // Attempt to assign the delimiters
begin
FDelimiters := InternalAssignDelimiters;
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@EDIXMLError026);
end;
AttributeString := FAttributes.CombineAttributes;
if AttributeString <> '' then
FData := FDelimiters.BTD + XMLTag_TransactionSet + FDelimiters.SpaceDelimiter +
AttributeString + FDelimiters.ETD
else
FData := FDelimiters.BTD + XMLTag_TransactionSet + FDelimiters.ETD;
if Length(FEDIDataObjects) > 0 then
for I := Low(FEDIDataObjects) to High(FEDIDataObjects) do
if Assigned(FEDIDataObjects[I]) then
FData := FData + FEDIDataObjects[I].Assemble;
FData := FData + FDelimiters.BOfETD + XMLTag_TransactionSet + FDelimiters.ETD;
FLength := Length(FData);
Result := FData; // Return assembled string
DeleteEDIDataObjects;
FState := ediAssembled;
end;
procedure TEDIXMLTransactionSet.Disassemble;
var
I, J, StartPos, SearchResult: Integer;
SearchTag, TempData: string;
NestedLoopCount: Integer;
begin
DeleteEDIDataObjects;
// Check delimiter assignment
if not Assigned(FDelimiters) then
begin
FDelimiters := InternalAssignDelimiters;
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@EDIXMLError025);
end;
// Set next start positon
StartPos := 1;
// Determine the nearest tag to search for
I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
if (I < J) or (J <= 0) then
SearchTag := XMLTag_Segment
else
SearchTag := XMLTag_TransactionSetLoop;
// Search for Segments or Loops
SearchResult := StrSearch(FDelimiters.BTD + SearchTag, FData, StartPos);
StartPos := SearchResult;
while SearchResult > 0 do
begin
if SearchTag = XMLTag_Segment then
begin
SearchResult := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult);
if SearchResult > 0 then
begin
SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
if SearchResult > 0 then
begin
I := AddSegment; //A dd Segment
EDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
EDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@EDIXMLError045);
end
else
raise EJclEDIError.CreateRes(@EDIXMLError044);
end
else
begin
NestedLoopCount := 0;
SearchResult := StartPos;
// Search for the proper end loop tag
repeat
I := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult); //Find loop end
J := StrSearch(FDelimiters.BTD + SearchTag, FData, SearchResult); //Find loop begin
if (I < J) or (J <= 0) then
begin
Dec(NestedLoopCount);
SearchResult := I + FDelimiters.ETDLength;
end
else
if (I > J) and (J > 0) then
begin
Inc(NestedLoopCount);
SearchResult := J + FDelimiters.ETDLength;
end;
until (NestedLoopCount <= 0) or (I <= 0);
SearchResult := I;
//
if SearchResult > 0 then
begin
SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
if SearchResult > 0 then
begin
I := AddGroup; // Add Transaction Set Loop
EDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
EDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@EDIXMLError032);
end
else
raise EJclEDIError.CreateRes(@EDIXMLError031);
end;
// Set next start positon
StartPos := SearchResult + FDelimiters.ETDLength;
// Determine the nearest tag to search for
I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
if (I < J) or (J <= 0) then
SearchTag := XMLTag_Segment
else
SearchTag := XMLTag_TransactionSetLoop;
SearchResult := StrSearch(FDelimiters.BTD + SearchTag, FData, StartPos);
end;
if Length(FEDIDataObjects) > 0 then
begin
// Search for Transaction Set Header and Trailer
FSTSegment := TEDIXMLSegment(FEDIDataObjects[0]);
FSESegment := TEDIXMLSegment(FEDIDataObjects[High(FEDIDataObjects)]);
if FSTSegment.Attributes.GetAttributeValue(XMLAttribute_Id) = XMLTag_TSHSegmentId then
begin
TempData := FEDIDataObjects[0].Assemble;
FreeAndNil(FEDIDataObjects[0]);
//
FSTSegment := TEDIXMLTransactionSetSegment.Create(Self);
FSTSegment.Data := TempData;
FSTSegment.Disassemble;
//
FEDIDataObjects[0] := FSTSegment;
end
else
begin
FSTSegment := nil;
raise EJclEDIError.CreateRes(@EDIXMLError059);
end;
if FSESegment.Attributes.GetAttributeValue(XMLAttribute_Id) = XMLTag_TSTSegmentId then
begin
TempData := FEDIDataObjects[High(FEDIDataObjects)].Assemble;
FreeAndNil(FEDIDataObjects[High(FEDIDataObjects)]);
//
FSESegment := TEDIXMLTransactionSetSegment.Create(Self);
FSESegment.Data := TempData;
FSESegment.Disassemble;
//
FEDIDataObjects[High(FEDIDataObjects)] := FSESegment;
end
else
begin
FSESegment := nil;
raise EJclEDIError.CreateRes(@EDIXMLError060);
end;
end
else
begin
FSTSegment := nil;
FSESegment := nil;
raise EJclEDIError.CreateRes(@EDIXMLError061);
end;
FData := '';
//
FState := ediDisassembled;
end;
function TEDIXMLTransactio
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -