2011/02/20

C++ Builder 로 RSS Feed 해석하기

굿모닝 팝스 듣기 용 프로그램을 만들면서 RSS Feed를 해석하려 했었는데 그때는 Indy Component 로 RSS 소스를 받은 후 XML parser를 이용해서 분석을 했었는데 프로그램이 정상 동작을 하지 않는 바람에 다시 손을 보면서 너무도 간단한 방법을 알게 되었다.





TXMLDocument 를 이용하면 간단하게 해결이 되었다. Reading and Manipulating XML files (RSS feeds) with Delphi 라는 글을 통해 알게 된 방법이며 아래는 이 글에서 소개한 델파이 코드이다.

 var
StartItemNode : IXMLNode;
ANode : IXMLNode;
STitle, sDesc, sLink : WideString;
begin //points to local XML file in "original" code
XMLDoc.FileName := 'http://0.tqn.com/6/g/delphi/b/index.xml';
XMLDoc.Active:=True;
StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item') ;
ANode := StartItemNode;
repeat
STitle := ANode.ChildNodes['title'].Text;
sLink := ANode.ChildNodes['link'].Text;
sDesc := ANode.ChildNodes['description'].Text;
//add to list view
with LV.Items.Add do
begin
Caption := STitle;
SubItems.Add(sLink) ;
SubItems.Add(sDesc)
end;
ANode := ANode.NextSibling;
until ANode = nil;
end.





아래 코드는 위의 코드를 참조하여 작성한 C++ Builder 에서 굿모닝 팝스 RSS를 해석하는 코드이다.

XMLDoc->Active = false;
XMLDoc->FileName = L"http://tune.kbs.co.kr/rss/1.xml";
XMLDoc->Active = true;

_di_IXMLNode nodeItem = XMLDoc->DocumentElement->ChildNodes->First()->ChildNodes->FindNode( L"item" );

if ( nodeItem == NULL )
{
ShowMessage( L"Cannot find item node" );
}
else
{
while ( nodeItem != NULL )
{
_di_IXMLNode nodeTitle = nodeItem->ChildNodes->FindNode( L"title" );
_di_IXMLNode nodeEnclosure = nodeItem->ChildNodes->FindNode( L"enclosure" );

if ( nodeTitle != NULL && nodeEnclosure != NULL )
{
_di_IXMLNode nodeURL = nodeEnclosure->AttributeNodes->FindNode( L"url" );

if ( nodeURL != NULL )
{
memXML->Lines->Append( nodeTitle->GetText() );
memXML->Lines->Append( nodeURL->GetText() );
}
}

nodeItem = nodeItem->NextSibling();
}

if ( cmbGMPList->Items->Count > 0 )
{
cmbGMPList->ItemIndex = 0;
}
}
<

Original Post : http://neodreamer-dev.tistory.com/506

No comments :

Post a Comment