📄 jcledixml.pas
字号:
// Set data start positon
StartPos := SearchResult + FDelimiters.ETDLength;
// Check for CData tag
FCData := False;
SearchResult := StrSearch(FDelimiters.BCDataD, FData, StartPos);
if SearchResult > 0 then
begin
StartPos := SearchResult + FDelimiters.BCDataLength;
FCData := True;
end;
//
SearchResult := StrSearch(FDelimiters.BOfETD + XMLTag_Element, FData, StartPos);
if SearchResult > 0 then
begin
EndPos := SearchResult;
SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
if SearchResult > 0 then
begin
if FCData then
EndPos := EndPos - FDelimiters.ECDataLength;
FData := Copy(FData, StartPos, (EndPos - StartPos));
end
else
raise EJclEDIError.CreateRes(@EDIXMLError050);
end
else
raise EJclEDIError.CreateRes(@EDIXMLError049);
// Handle Entity Reference Characters
StrReplace(FData, EDIXML_HTMLLessThanSign, EDIXML_LessThanSign, [rfReplaceAll]);
StrReplace(FData, EDIXML_HTMLGreaterThanSign, EDIXML_GreaterThanSign, [rfReplaceAll]);
StrReplace(FData, EDIXML_HTMLQuotationMark, EDIXML_QuotationMark, [rfReplaceAll]);
StrReplace(FData, EDIXML_HTMLApostrophe, EDIXML_Apostrophe, [rfReplaceAll]);
StrReplace(FData, EDIXML_HTMLAmpersand, EDIXML_Ampersand, [rfReplaceAll]);
//
FState := ediDisassembled;
end;
function TEDIXMLElement.GetIndexPositionFromParent: Integer;
var
I: Integer;
begin
Result := -1;
if Assigned(Parent) and (Parent is TEDIXMLSegment) then
for I := Low(TEDIXMLSegment(Parent).Elements) to High(TEDIXMLSegment(Parent).Elements) do
if TEDIXMLSegment(Parent).Element[I] = Self then
Result := I;
end;
function TEDIXMLElement.InternalAssignDelimiters: TEDIXMLDelimiters;
begin
Result := nil;
// Attempt to assign the delimiters
if not Assigned(FDelimiters) then
// Get the delimiters from the parent segment
if Assigned(Parent) and (Parent is TEDIXMLSegment) then
Result := Parent.Delimiters;
end;
//=== { TEDIXMLSegment } =====================================================
constructor TEDIXMLSegment.Create(Parent: TEDIXMLDataObject; ElementCount: Integer);
begin
if Assigned(Parent) and (Parent is TEDIXMLTransactionSet) then
inherited Create(Parent)
else
inherited Create(nil);
FEDIDOT := ediSegment;
SetLength(FElements, 0);
AddElements(ElementCount);
end;
constructor TEDIXMLSegment.Create(Parent: TEDIXMLDataObject);
begin
if Assigned(Parent) and (Parent is TEDIXMLDataObjectGroup) then
inherited Create(Parent)
else
inherited Create(nil);
FEDIDOT := ediSegment;
SetLength(FElements, 0);
end;
destructor TEDIXMLSegment.Destroy;
begin
DeleteElements;
inherited Destroy;
end;
function TEDIXMLSegment.AddElement: Integer;
begin
SetLength(FElements, Length(FElements) + 1);
FElements[High(FElements)] := InternalCreateElement;
Result := High(FElements); // Return position of element
end;
function TEDIXMLSegment.AddElements(Count: Integer): Integer;
var
I, J: Integer;
begin
I := Length(FElements);
Result := I; // Return position of 1st element
// Resize
SetLength(FElements, Length(FElements) + Count);
// Add
for J := I to High(FElements) do
FElements[J] := InternalCreateElement;
end;
function TEDIXMLSegment.AppendElement(Element: TEDIXMLElement): Integer;
begin
SetLength(FElements, Length(FElements) + 1);
FElements[High(FElements)] := Element;
Element.Parent := Self;
Result := High(FElements); // Return position of element
end;
function TEDIXMLSegment.AppendElements(ElementArray: TEDIXMLElementArray): Integer;
var
I, J, K: Integer;
begin
I := 0;
J := Length(FElements);
Result := J; // Return position of 1st element
// Resize
SetLength(FElements, Length(FElements) + Length(ElementArray));
//Append
for K := J to High(ElementArray) do
begin
FElements[K] := ElementArray[I];
FElements[K].Parent := Self;
Inc(I);
end;
end;
function TEDIXMLSegment.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(@EDIXMLError042);
end;
AttributeString := FAttributes.CombineAttributes;
if AttributeString <> '' then
FData := FDelimiters.BTD + XMLTag_Segment + FDelimiters.SpaceDelimiter +
AttributeString + FDelimiters.ETD
else
FData := FDelimiters.BTD + XMLTag_Segment + FDelimiters.ETD;
if Length(FElements) > 0 then
for I := Low(FElements) to High(FElements) do
if Assigned(FElements[I]) then
FData := FData + FElements[I].Assemble
else
FData := FData + FDelimiters.BTD + XMLTag_Element + FDelimiters.ETD +
FDelimiters.BOfETD + XMLTag_Element + FDelimiters.ETD;
FData := FData + FDelimiters.BOfETD + XMLTag_Segment + FDelimiters.ETD;
FLength := Length(FData);
Result := FData; // Return assembled string
DeleteElements;
FState := ediAssembled;
end;
procedure TEDIXMLSegment.DeleteElement(Element: TEDIXMLElement);
var
I: Integer;
begin
for I := Low(FElements) to High(FElements) do
if FElements[I] = Element then
DeleteElement(I);
end;
procedure TEDIXMLSegment.DeleteElement(Index: Integer);
var
I: Integer;
begin
if (Length(FElements) > 0) and (Index >= Low(FElements)) and (Index <= High(FElements)) then
begin
// Delete
FreeAndNil(FElements[Index]);
// Shift
for I := Index + 1 to High(FElements) do
FElements[I - 1] := FElements[I];
// Resize
SetLength(FElements, High(FElements));
end
else
raise EJclEDIError.CreateResFmt(@EDIXMLError058, [IntToStr(Index)]);
end;
procedure TEDIXMLSegment.DeleteElements;
var
I: Integer;
begin
for I := Low(FElements) to High(FElements) do
// Delete
FreeAndNil(FElements[I]);
// Resize
SetLength(FElements, 0);
end;
procedure TEDIXMLSegment.DeleteElements(Index, Count: Integer);
var
I: Integer;
begin
if (Length(FElements) > 0) and (Index >= Low(FElements)) and (Index <= High(FElements)) then
begin
// Delete
for I := Index to (Index + Count) - 1 do
FreeAndNil(FElements[I]);
// Shift
for I := (Index + Count) to High(FElements) do
begin
FElements[I - Count] := FElements[I];
FElements[I] := nil;
end;
// Resize
SetLength(FElements, Length(FElements) - Count);
end
else
raise EJclEDIError.CreateResFmt(@EDIXMLError058, [IntToStr(Index)]);
end;
procedure TEDIXMLSegment.Disassemble;
var
I, StartPos, SearchResult: Integer;
XMLStartTag: string;
begin
DeleteElements;
// Check delimiter assignment
if not Assigned(FDelimiters) then
begin
FDelimiters := InternalAssignDelimiters;
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@EDIXMLError041);
end;
// Set next start positon
StartPos := 1;
// Move past begin segment tag
SearchResult := StrSearch(FDelimiters.BTD + XMLTag_Segment, 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(@EDIXMLError043);
// Set next start positon
StartPos := SearchResult + FDelimiters.ETDLength;
// Search for element
SearchResult := StrSearch(FDelimiters.BTD + XMLTag_Element, FData, StartPos);
// Search for Segments
while SearchResult > 0 do
begin
SearchResult := StrSearch(FDelimiters.BOfETD + XMLTag_Element, FData, SearchResult);
if SearchResult > 0 then
begin
SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
if SearchResult > 0 then
begin
I := AddElement; // Add Element
FElements[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
FElements[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@EDIXMLError050);
end
else
raise EJclEDIError.CreateRes(@EDIXMLError049);
// Set next start positon
StartPos := SearchResult + FDelimiters.ETDLength;
// Search for element
SearchResult := StrSearch(FDelimiters.BTD + XMLTag_Element, FData, StartPos);
end;
FData := '';
//
FState := ediDisassembled;
end;
function TEDIXMLSegment.GetElement(Index: Integer): TEDIXMLElement;
begin
if Length(FElements) > 0 then
if Index >= Low(FElements) then
if Index <= High(FElements) then
begin
if not Assigned(FElements[Index]) then
raise EJclEDIError.CreateResFmt(@EDIXMLError057, [IntToStr(Index)]);
Result := FElements[Index];
end
else
raise EJclEDIError.CreateResFmt(@EDIXMLError056, [IntToStr(Index)])
else
raise EJclEDIError.CreateResFmt(@EDIXMLError055, [IntToStr(Index)])
else
raise EJclEDIError.CreateResFmt(@EDIXMLError054, [IntToStr(Index)]);
end;
function TEDIXMLSegment.GetIndexPositionFromParent: Integer;
var
I: Integer;
begin
Result := -1;
if Assigned(Parent) and (Parent is TEDIXMLTransactionSet) then
for I := Low(TEDIXMLTransactionSet(Parent).EDIDataObjects) to
High(TEDIXMLTransactionSet(Parent).EDIDataObjects) do
if TEDIXMLTransactionSet(Parent).EDIDataObject[I] = Self then
begin
Result := I;
Break;
end;
end;
function TEDIXMLSegment.InsertElement(InsertIndex: Integer): Integer;
var
I: Integer;
begin
Result := InsertIndex;
if (Length(FElements) > 0) and (InsertIndex >= Low(FElements)) and
(InsertIndex <= High(FElements)) then
begin
// Resize
SetLength(FElements, Length(FElements) + 1);
// Shift
for I := High(FElements) downto InsertIndex + 1 do
FElements[I] := FElements[I - 1];
// Insert
FElements[InsertIndex] := InternalCreateElement;
end
else
Result := AddElement;
end;
function TEDIXMLSegment.InsertElement(InsertIndex: Integer; Element: TEDIXMLElement): Integer;
var
I: Integer;
begin
Result := InsertIndex;
if (Length(FElements) > 0) and (InsertIndex >= Low(FElements)) and
(InsertIndex <= High(FElements)) then
begin
// Resize
SetLength(FElements, Length(FElements) + 1);
// Shift
for I := High(FElements) downto InsertIndex + 1 do
FElements[I] := FElements[I - 1];
// Insert
FElements[InsertIndex] := Element;
FElements[InsertIndex].Parent := Self;
end
else
Result := AppendElement(Element);
end;
function TEDIXMLSegment.InsertElements(InsertIndex: Integer;
ElementArray: TEDIXMLElementArray): Integer;
var
I, J, K: Integer;
begin
Result := InsertIndex;
I := Length(ElementArray);
if (Length(FElements) > 0) and (InsertIndex >= Low(FElements)) and
(InsertIndex <= High(FElements)) then
begin
// Resize
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -