📄 urdffeed.pas
字号:
unit uRDFFeed;
interface
uses Classes, uW3CDTF, FastStringFuncs, uRssBase, MSXML2_TLB, uConstants;
type
TRDFFeed = class(TInterfacedObject, IRSSBase)
private
FDoc:IXMLDOMDocument2;
fItems : IRSSItemBaseList;
Fimage : IRSSImageBase;
FTitle, FDescription : string;
FVersion, FLink, FCreator : WideString;
protected
function Get_Version : WideString;
function Get_Title : string;
function Get_Link: WideString;
function Get_Description: string;
function Get_Creator: WideString;
function Get_Items: IRSSItemBaseList;
function Get_Image: IRSSImageBase;
public
constructor Create(theDoc : IXMLDOMDocument2);
procedure SaveXml(Destination: OleVariant);
property Items:IRSSItemBaseList read fItems write fItems;
property Image:IRSSImageBase read FImage write FImage;
property Version: WideString read Get_Version;
property Title: string read Get_Title;
property Link: Widestring read Get_Link;
property Description: string read Get_Description;
property Creator: WideString read Get_Creator;
end;
TRDFItems = class(TInterfacedObject, IRSSItemBaseList)
private
fItems : TList;
fNode:IXMLDOMNode;
protected
procedure Add(item : TInterfacedObject);overload;
function Add:IRSSItemBase;overload;
procedure Delete(Index:integer);
function Get_Item(index : integer): IRSSItemBase;
function Get_ItemByGuid(guid : string): IRSSItemBase;
function Get_Count(): integer;
function IndexOfLink(ALink:WideString):integer;
function IndexOfTitle(ATitle:String):integer;
public
constructor Create(theNode:IXMLDOMNode);
end;
TRDFItem = class(TInterfacedObject, IRSSItemBase)
private
FAuthor: string;
FTitle: string;
FPubDate: TW3CDTF;
FGuid: WideString;
FLink: WideString;
FDescription: string;
FCategory : string;
FCommentCount : integer;
FComment : Widestring;
FCommentRSS : Widestring;
fNode:IXMLDOMNode;
protected
function Get_Author: string;
function Get_Title: string;
function Get_PubDate: TW3CDTF;
function Get_Guid: WideString;
function Get_Link: WideString;
function Get_Category: string;
function Get_Creator: WideString;
function Get_CommentCount: integer;
function Get_CommentRss: WideString;
function Get_CommentURL: WideString;
function Get_Comment: WideString;
function Get_Description: string;
public
constructor Create(theNode : IXmlDOMNode);
end;
function GetRDFFeed(Doc: IXMLDOMDocument2): IRSSBase;
implementation
uses SysUtils;
function GetRDFFeed(Doc: IXMLDOMDocument2): IRSSBase;
begin
Result := TRDFFeed.Create(Doc) as IRSSBase;
end;
{ TRDFFeed }
constructor TRDFFeed.Create(theDoc : IXMLDOMDocument2);
var
i : integer;
channelNodes : IXMLDOMNodeList;
Node: IXmlDomNode;
begin
FDoc:=theDoc;
node := FDoc.documentElement;
fItems := TRDFItems.Create(node);
Fimage := TRSSImageBase.Create(node.selectSingleNode('image'));
FCreator := GetNodeVal(node, 'channel/creator');
FDescription := GetNodeVal(node, 'channel/description');
FTitle := ExtractNonHTML(GetNodeVal(node, 'channel/title'));
FLink := GetNodeVal(node, 'channel/link');
FVersion := 'RDF 1.0';
channelNodes := node.SelectNodes('item');
for i := 0 to channelNodes.length - 1 do
fitems.Add( TRDFItem.Create(channelNodes.item[i]) );
end;
procedure TRDFFeed.SaveXml(Destination: OleVariant);
begin
FDoc.save(Destination);
end;
function TRDFFeed.Get_Creator: WideString; begin Result := FCreator; end;
function TRDFFeed.Get_Description: string; begin Result := FDescription; end;
function TRDFFeed.Get_Image: IRSSImageBase; begin Result := FImage; end;
function TRDFFeed.Get_Items: IRSSItemBaseList; begin Result := fItems; end;
function TRDFFeed.Get_Link: WideString; begin Result := FLink; end;
function TRDFFeed.Get_Title: string; begin Result := FTitle; end;
function TRDFFeed.Get_Version: WideString; begin Result := FVersion; end;
{ TRDFItems }
constructor TRDFItems.Create(theNode:IXMLDOMNode);
begin
fItems := TList.Create();
fNode:=theNode;
end;
procedure TRDFItems.Add(item: TInterfacedObject); begin fItems.Add(item); end;
function TRDFItems.Add:IRSSItemBase;
var Item:TRDFItem;
begin
item:=TRDFItem.Create(fNode.appendChild(fNode.ownerDocument.createElement('item')));
fItems.Add(item);
Result:=item;
end;
procedure TRDFItems.Delete(Index:integer);
begin
fNode.removeChild(TRDFItem(fItems[Index]).FNode);
fItems.Delete(Index);
end;
function TRDFItems.IndexOfLink(ALink:WideString):integer;
var i:Integer;
begin
Result:=-1;
for i:= 0 to fItems.Count - 1 do
if TRDFItem(fItems[i]).FLink=ALink then
begin
Result:=i;
Exit;
end;
end;
function TRDFItems.IndexOfTitle(ATitle:String):integer;
var i:Integer;
begin
Result:=-1;
for i:= 0 to fItems.Count - 1 do
if TRDFItem(fItems[i]).FTitle=ATitle then
begin
Result:=i;
Exit;
end;
end;
function TRDFItems.Get_Count: integer; begin Result := fItems.Count; end;
function TRDFItems.Get_Item(Index: Integer): IRSSItemBase; begin Result := TRDFItem(fItems[index]); end;
function TRDFItems.Get_ItemByGuid(guid: string): IRSSItemBase;
begin
//TODO: Not implemented
Result := nil;
end;
{ TRDFItem }
constructor TRDFItem.Create(theNode: IXmlDOMNode);
var
str : WideString;
tmpNode : IXmlDOMNode;
begin
FAuthor:='';
FTitle:='';
FGuid:='';
FLink:='';
FDescription:='';
FCommentCount := 0;
FCategory := '';
FComment := '';
FCommentRSS := '';
if assigned(theNode) then begin
fNode:=theNode;
FAuthor := getNodeVal(thenode, 'author');
if FAuthor = '' then FAuthor := getNodeVal(thenode, 'dc:creator');
FCategory := getNodeVal(thenode, 'category');
FComment := getNodeVal(thenode, 'comment');
FCommentRSS := getNodeVal(thenode, 'commentRss');
str := getNodeVal(thenode, 'comments');
if str = '' then FCommentCount := 0 else FCommentCount := StrToInt(str);
FTitle := ExtractNonHTML(getNodeVal(thenode, 'title'));
FGuid := getNodeVal(thenode, 'guid');
FLink := getNodeVal(thenode, 'link');
try
str := getNodeVal(thenode, 'dc:date');
if str = '' then
str:=getNodeVal(thenode, 'date');
if str = '' then
str:=getNodeVal(thenode, 'pubDate');
if str='' then
str := getNodeVal(theNode,'pubdate');
FPubDate := TW3CDTF.Create(str);
except
FPubDate := TW3CDTF.CreateDateTime(0);
end;
try
tmpNode := thenode.selectSingleNode('body');
if Assigned(tmpnode) then
FDescription := tmpNode.xml
else
FDescription := getNodeVal(thenode, 'description');
except
FDescription := getNodeVal(thenode, 'description');
end;
end else
FPubDate := TW3CDTF.CreateDatetime(0);
end;
function TRDFItem.Get_Author: string; begin Result := FAuthor; end;
function TRDFItem.Get_Category: string; begin Result := FCategory; end;
function TRDFItem.Get_Comment: WideString; begin Result := FComment; end;
function TRDFItem.Get_CommentRss: WideString; begin Result := FCommentRSS; end;
function TRDFItem.Get_CommentCount: integer; begin Result := FCommentCount; end;
function TRDFItem.Get_Creator: WideString; begin Result := Get_Author(); end;
function TRDFItem.Get_Description: string; begin Result := FDescription; end;
function TRDFItem.Get_Guid: WideString; begin Result := FGuid; end;
function TRDFItem.Get_Link: WideString; begin Result := FLink; end;
function TRDFItem.Get_PubDate: TW3CDTF; begin Result := FPubDate; end;
function TRDFItem.Get_Title: string; begin Result := FTitle; end;
function TRDFItem.Get_CommentURL: WideString; begin Result := ''; end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -