📄 jvsimplexml.pas
字号:
end;
procedure TJvSimpleXML.DoEncodeValue(var Value: string);
begin
if Assigned(FOnEncodeValue) then
FOnEncodeValue(Self, Value)
else
if sxoAutoEncodeValue in Options then
Value := SimpleXMLEncode(Value)
else
if sxoAutoEncodeEntity in Options then
Value := EntityEncode(Value);
end;
procedure TJvSimpleXML.DoLoadProgress(const APosition, ATotal: Integer);
begin
if Assigned(FOnLoadProg) then
FOnLoadProg(Self, APosition, ATotal);
end;
procedure TJvSimpleXML.DoSaveProgress;
begin
if Assigned(FOnSaveProg) then
begin
Inc(FSaveCount);
FOnSaveProg(Self, FSaveCurrent, FSaveCount);
end;
end;
procedure TJvSimpleXML.DoTagParsed(const AName: string);
begin
if Assigned(FOnTagParsed) then
FOnTagParsed(Self, AName);
end;
procedure TJvSimpleXML.DoValueParsed(const AName, AValue: string);
begin
if Assigned(FOnValue) then
FOnValue(Self, AName, AValue);
end;
procedure TJvSimpleXML.LoadFromFile(const FileName: TFileName);
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
Stream.LoadFromFile(FileName);
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TJvSimpleXML.LoadFromResourceName(Instance: THandle;
const ResName: string);
const
RT_RCDATA = PChar(10);
var
Stream: TResourceStream;
begin
Stream := TResourceStream.Create(Instance, ResName, RT_RCDATA);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TJvSimpleXML.LoadFromStream(Stream: TStream);
var
AOutStream: TStream;
DoFree: Boolean;
begin
FRoot.Clear;
FProlog.Clear;
AOutStream := nil;
DoFree := False;
try
if Assigned(FOnDecodeStream) then
begin
AOutStream := TMemoryStream.Create;
DoFree := True;
FOnDecodeStream(Self, Stream, AOutStream);
AOutStream.Seek(0, soFromBeginning);
end
else
AOutStream := Stream;
if Assigned(FOnLoadProg) then
begin
FOnLoadProg(Self, AOutStream.Position, AOutStream.Size);
// Read doctype and so on
FProlog.LoadFromStream(AOutStream, Self);
// Read elements
FRoot.LoadFromStream(AOutStream, Self);
FOnLoadProg(Self, AOutStream.Position, AOutStream.Size);
end
else
begin
if Assigned(FOnTagParsed) or Assigned(FOnValue) then
begin
FProlog.LoadFromStream(AOutStream, Self);
FRoot.LoadFromStream(AOutStream, Self);
end
else
begin
FProlog.LoadFromStream(AOutStream);
FRoot.LoadFromStream(AOutStream);
end;
end;
finally
if DoFree then
AOutStream.Free;
end;
end;
procedure TJvSimpleXML.LoadFromString(const Value: string);
var
Stream: TStringStream;
begin
Stream := TStringStream.Create(Value);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
procedure TJvSimpleXML.SaveToFile(FileName: TFileName);
var
Stream: TFileStream;
begin
if FileExists(FileName) then
begin
Stream := TFileStream.Create(FileName, fmOpenWrite);
Stream.Size := 0;
end
else
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
procedure TJvSimpleXML.SaveToStream(Stream: TStream);
var
lCount: Integer;
AOutStream: TStream;
DoFree: Boolean;
begin
if Assigned(FOnEncodeStream) then
begin
AOutStream := TMemoryStream.Create;
DoFree := True;
end
else
begin
AOutStream := Stream;
DoFree := False;
end;
try
if Assigned(FOnSaveProg) then
begin
lCount := Root.ChildsCount + Prolog.Count;
FSaveCount := lCount;
FSaveCurrent := 0;
FOnSaveProg(Self, 0, lCount);
Prolog.SaveToStream(AOutStream, Self);
Root.SaveToStream(AOutStream, '', Self);
FOnSaveProg(Self, lCount, lCount);
end
else
begin
Prolog.SaveToStream(AOutStream);
Root.SaveToStream(AOutStream);
end;
if Assigned(FOnEncodeStream) then
begin
AOutStream.Seek(0, soFromBeginning);
FOnEncodeStream(Self, AOutStream, Stream);
end;
finally
if DoFree then
AOutStream.Free;
end;
end;
function TJvSimpleXML.SaveToString: string;
var
Stream: TStringStream;
begin
Stream := TStringStream.Create('');
try
SaveToStream(Stream);
Result := Stream.DataString;
finally
Stream.Free;
end;
end;
procedure TJvSimpleXML.SetFileName(Value: TFileName);
begin
FFileName := Value;
LoadFromFile(Value);
end;
//=== { TJvSimpleXMLElem } ===================================================
procedure TJvSimpleXMLElem.Assign(Value: TJvSimpleXMLElem);
var
Elems: TJvSimpleXMLElem;
Elem: TJvSimpleXMLElem;
I: Integer;
begin
Clear;
if Value = nil then
Exit;
Elems := TJvSimpleXMLElem(Value);
Name := Elems.Name;
Self.Value := Elems.Value;
for I := 0 to Elems.Properties.Count - 1 do
Properties.Add(Elems.Properties[I].Name, Elems.Properties[I].Value);
for I := 0 to Elems.Items.Count - 1 do
begin
Elem := Items.Add(Elems.Items[I].Name, Elems.Items[I].Value);
Elem.Assign(TJvSimpleXMLElem(Elems.Items[I]));
end;
end;
procedure TJvSimpleXMLElem.Clear;
begin
if FItems <> nil then
FItems.Clear;
if FProps <> nil then
FProps.Clear;
end;
constructor TJvSimpleXMLElem.Create(const AOwner: TJvSimpleXMLElem);
begin
inherited Create;
FName := '';
FParent := TJvSimpleXMLElem(AOwner);
FContainer := nil;
end;
destructor TJvSimpleXMLElem.Destroy;
begin
FParent := nil;
Clear;
FreeAndNil(FItems);
FreeAndNil(FProps);
inherited Destroy;
end;
procedure TJvSimpleXMLElem.Error(const S: string);
begin
raise EJvSimpleXMLError.Create(S);
end;
procedure TJvSimpleXMLElem.FmtError(const S: string;
const Args: array of const);
begin
Error(Format(S, Args));
end;
function TJvSimpleXMLElem.FullName: string;
begin
if FNameSpace <> '' then
Result := FNameSpace + ':' + Name
else
Result := Name;
end;
procedure TJvSimpleXMLElem.GetBinaryValue(const Stream: TStream);
var
I, J: Integer;
St: string;
Buf: array [0..cBufferSize - 1] of Byte;
begin
I := 1;
J := 0;
while I < Length(Value) do
begin
St := '$' + Value[I] + Value[I + 1];
if J = cBufferSize - 1 then //Buffered write to speed up the process a little
begin
Stream.Write(Buf, J);
J := 0;
end;
Buf[J] := StrToIntDef(St, 0);
Inc(J);
Inc(I, 2);
end;
Stream.Write(Buf, J);
end;
function TJvSimpleXMLElem.GetBoolValue: Boolean;
begin
Result := StrToBoolDef(Value, False);
end;
function TJvSimpleXMLElem.GetChildIndex(
const AChild: TJvSimpleXMLElem): Integer;
begin
if FItems = nil then
Result := -1
else
Result := FItems.FElems.IndexOfObject(AChild);
end;
function TJvSimpleXMLElem.GetChildsCount: Integer;
var
I: Integer;
begin
Result := 1;
if FItems <> nil then
for I := 0 to FItems.Count - 1 do
Result := Result + FItems[I].ChildsCount;
end;
function TJvSimpleXMLElem.GetFloatValue: Extended;
begin
Result := StrToFloatDef(Value, 0.0);
end;
function TJvSimpleXMLElem.GetIntValue: Int64;
begin
Result := StrToInt64Def(Value, -1);
end;
function TJvSimpleXMLElem.GetItems: TJvSimpleXMLElems;
begin
if FItems = nil then
FItems := TJvSimpleXMLElems.Create(Self);
Result := FItems;
end;
function TJvSimpleXMLElem.GetProps: TJvSimpleXMLProps;
begin
if FProps = nil then
FProps := TJvSimpleXMLProps.Create(Self);
Result := FProps;
end;
function TJvSimpleXMLElem.GetSimpleXML: TJvSimpleXML;
begin
if FParent <> nil then
Result := FParent.GetSimpleXML
else
Result := FSimpleXML;
end;
procedure TJvSimpleXMLElem.LoadFromString(const Value: string);
var
Stream: TStringStream;
begin
Stream := TStringStream.Create(Value);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
function TJvSimpleXMLElem.SaveToString: string;
var
Stream: TStringStream;
begin
Stream := TStringStream.Create('');
try
SaveToStream(Stream);
Result := Stream.DataString;
finally
Stream.Free;
end;
end;
procedure TJvSimpleXMLElem.SetBoolValue(const Value: Boolean);
begin
FValue := BoolToStr(Value);
end;
procedure TJvSimpleXMLElem.SetFloatValue(const Value: Extended);
begin
FValue := FloatToStr(Value);
end;
procedure TJvSimpleXMLElem.SetIntValue(const Value: Int64);
begin
FValue := IntToStr(Value);
end;
procedure TJvSimpleXMLElem.SetName(const Value: string);
begin
if (Value <> FName) and (Value <> '') then
begin
if (Parent <> nil) and (FName <> '') then
Parent.Items.DoItemRename(Self, Value);
FName := Value;
end;
end;
//=== { TJvSimpleXMLElems } ==================================================
function TJvSimpleXMLElems.Add(const Name: string): TJvSimpleXMLElemClassic;
begin
Result := TJvSimpleXMLElemClassic.Create(Parent);
Result.FName := Name; //Directly set parent to avoid notification
AddChild(Result);
end;
function TJvSimpleXMLElems.Add(const Name, Value: string): TJvSimpleXMLElemClassic;
begin
Result := TJvSimpleXMLElemClassic.Create(Parent);
Result.Name := Name;
Result.Value := Value;
AddChild(Result);
end;
function TJvSimpleXMLElems.Add(const Name: string; const Value: Int64): TJvSimpleXMLElemClassic;
begin
Result := Add(Name, IntToStr(Value));
end;
function TJvSimpleXMLElems.Add(Value: TJvSimpleXMLElem): TJvSimpleXMLElem;
begin
if Value <> nil then
AddChild(Value);
Result := Value;
end;
function TJvSimpleXMLElems.Add(const Name: string;
const Value: Boolean): TJvSimpleXMLElemClassic;
begin
Result := Add(Name, BoolToStr(Value));
end;
function TJvSimpleXMLElems.Add(const Name: string;
const Value: TStream): TJvSimpleXMLElemClassic;
var
Stream: TStringStream;
Buf: array [0..cBufferSize - 1] of Byte;
St: string;
I, Count: Integer;
begin
Stream := TStringStream.Create('');
repeat
Count := Value.Read(Buf, SizeOf(Buf));
St := '';
for I := 0 to Count - 1 do
St := St + IntToHex(Buf[I], 2);
Stream.WriteString(St);
until Count = 0;
Result := Add(Name, Stream.DataString);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -