Files
lazarus-ccr/wst/trunk/wst_fpc_xml.pas

142 lines
3.4 KiB
ObjectPascal
Raw Normal View History

{$INCLUDE wst_global.inc}
unit wst_fpc_xml;
interface
uses
Classes, SysUtils, DOM;
{$INCLUDE wst.inc}
{$INCLUDE wst_delphi.inc}
type
{ TDOMNodeSelectListImp }
TDOMNodeSelectListImp = class(TDOMNodeList)
private
FFilter: DOMString;
FUseFilter: Boolean;
protected
procedure BuildList(); override;
public
constructor Create(ANode: TDOMNode; const AFilter: DOMString);
end;
function FilterList(const ANode : TDOMNode; const ANodeName : DOMString) : TDOMNodeList ;
function GetNodeItemsCount(const ANode : TDOMNode): Integer;
function GetNodeListCount(ANodeList : TDOMNodeList) : Integer ;overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
function GetNodeListCount(ANodeList : TDOMNamedNodeMap) : Integer ;overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure ReleaseDomNode(ADomNode : TDOMNode);overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure ReleaseDomNode(ADomNode : TDOMNodeList);overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure ReleaseDomNode(ADomNode : TDOMNamedNodeMap);overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
function CreateDoc() : TXMLDocument ;{$IFDEF USE_INLINE}inline;{$ENDIF}
function FindNode(ANode : TDOMNode;const ANodeName : string) : TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
function NodeToBuffer(ANode : TDOMNode):string ;
implementation
uses XMLWrite;
function GetNodeItemsCount(const ANode : TDOMNode): Integer;
var
chdLst : TDOMNodeList;
begin
if ANode.HasChildNodes then begin
chdLst := ANode.ChildNodes;
try
Result := chdLst.Count;
finally
chdLst.Release();
end;
end else begin
Result := 0;
end;
end;
function GetNodeListCount(ANodeList : TDOMNodeList) : Integer ;overload;
begin
Result := ANodeList.Count;
end;
function GetNodeListCount(ANodeList : TDOMNamedNodeMap) : Integer ;overload;
begin
Result := ANodeList.Length;
end;
procedure ReleaseDomNode(ADomNode : TDOMNode);overload;
begin
ADomNode.Free();
end;
procedure ReleaseDomNode(ADomNode : TDOMNodeList);overload;
begin
ADomNode.Release();
end;
procedure ReleaseDomNode(ADomNode : TDOMNamedNodeMap);overload;
begin
ADomNode.Free();
end;
function CreateDoc() : TXMLDocument ;
begin
Result := TXMLDocument.Create();
Result.Encoding := 'UTF-8';
end;
function FindNode(ANode : TDOMNode;const ANodeName : string) : TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
begin
Result := ANode.FindNode(ANodeName);
end;
function NodeToBuffer(ANode : TDOMNode):string ;
var
locStream : TStringStream;
begin
locStream := TStringStream.Create('');
try
WriteXML(ANode,locStream);
Result := locStream.DataString;
finally
locStream.Free();
end;
end;
function FilterList(const ANode : TDOMNode; const ANodeName : DOMString) : TDOMNodeList ;
begin
Result := TDOMNodeSelectListImp.Create(ANode,ANodeName);
end;
{ TDOMNodeSelectListImp }
type
TDOMNodeCracked = class(TDOMNode);
procedure TDOMNodeSelectListImp.BuildList();
var
Child: TDOMNode;
begin
FList.Clear;
FRevision := TDOMNodeCracked(FNode).GetRevision();
Child := FNode.FirstChild;
while ( Child <> nil ) do begin
if ( Child.NodeType = ELEMENT_NODE ) and
( ( not FUseFilter ) or ( TDOMElement(Child).TagName = FFilter ) )
then begin
FList.Add(Child);
end;
Child := Child.NextSibling
end;
end;
constructor TDOMNodeSelectListImp.Create(ANode: TDOMNode; const AFilter: DOMString);
begin
inherited Create(ANode);
FFilter := AFilter;
FUseFilter := ( FFilter <> '*' );
end;
end.