
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4210 8e941d3f-bd1b-0410-a28a-d453659cc2b4
112 lines
2.8 KiB
ObjectPascal
112 lines
2.8 KiB
ObjectPascal
{
|
|
This file is part of the Web Service Toolkit
|
|
Copyright (c) 2006-2015 by Inoussa OUEDRAOGO
|
|
|
|
This file is provide under modified LGPL licence
|
|
( the files COPYING.modifiedLGPL and COPYING.LGPL).
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
}
|
|
{$INCLUDE wst_global.inc}
|
|
unit xml_serializer;
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, DOM,
|
|
imp_utils, wst_fpc_xml, base_service_intf, service_intf, base_soap_formatter;
|
|
|
|
type
|
|
|
|
IXmlFormatter = interface(IFormatterBase)
|
|
['{4383B991-D07A-4720-A418-572715233259}']
|
|
procedure BeginScope(const AScopeName,ANameSpace : string);
|
|
procedure PrepareForRead();
|
|
function BeginScopeRead(const AScopeName, ANameSpace : string) : Integer;
|
|
end;
|
|
|
|
{ TXmlFormatter }
|
|
|
|
TXmlFormatter = class(TSOAPBaseFormatter,IFormatterBase,IXmlFormatter)
|
|
private
|
|
public
|
|
constructor Create();override;
|
|
procedure PrepareForRead();
|
|
procedure BeginScope(const AScopeName,ANameSpace : string);
|
|
function BeginScopeRead(const AScopeName, ANameSpace : string) : Integer;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TXmlFormatter }
|
|
|
|
constructor TXmlFormatter.Create();
|
|
begin
|
|
inherited Create;
|
|
Style := Document;
|
|
end;
|
|
|
|
procedure TXmlFormatter.PrepareForRead();
|
|
begin
|
|
ClearStack();
|
|
PushStack(GetXmlDoc().DocumentElement);
|
|
end;
|
|
|
|
procedure TXmlFormatter.BeginScope(const AScopeName, ANameSpace: string);
|
|
begin
|
|
inherited BeginScope(AScopeName,ANameSpace,'',stObject,asNone);
|
|
end;
|
|
|
|
function TXmlFormatter.BeginScopeRead(const AScopeName, ANameSpace: string) : Integer;
|
|
var
|
|
locNode : TDOMNode;
|
|
stk : TStackItem;
|
|
nmspc,nmspcSH : string;
|
|
strNodeName : string;
|
|
begin
|
|
if ( Style = Document ) then begin
|
|
nmspc := ANameSpace;
|
|
if IsStrEmpty(nmspc) then begin
|
|
nmspcSH := ''
|
|
end else begin
|
|
nmspcSH := FindAttributeByValueInScope(nmspc);
|
|
if not IsStrEmpty(nmspcSH) then begin
|
|
nmspcSH := Copy(nmspcSH,Length('xmlns:')+1,MaxInt);
|
|
end;
|
|
end;
|
|
if IsStrEmpty(nmspcSH) then begin
|
|
strNodeName := AScopeName
|
|
end else begin
|
|
if ( Pos(':',AScopeName) < 1 ) then begin
|
|
strNodeName := nmspcSH + ':' + AScopeName
|
|
end else begin
|
|
strNodeName := AScopeName;
|
|
end;
|
|
end;
|
|
end else begin
|
|
nmspcSH := '';
|
|
strNodeName := AScopeName;
|
|
end;
|
|
|
|
stk := StackTop();
|
|
locNode := stk.FindNode(strNodeName);
|
|
if (locNode = nil) and (Style = Document) then
|
|
locNode := FindXMLNodeWithNamespaceInSubScope(nmspc,AScopeName);
|
|
|
|
if ( locNode = nil ) then begin
|
|
Result := -1;
|
|
end else begin
|
|
PushStack(locNode);
|
|
if ( Style = Document ) then begin
|
|
StackTop().SetNameSpace(nmspc);
|
|
end;
|
|
Result := StackTop().ItemsCount;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|