Showing posts with label XML. Show all posts
Showing posts with label XML. Show all posts

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

2008/11/27

작고 빠르고 편한 Open Source XML Parser - RapidXML

XML 데이터를 분석해야 할 일이 있어서 공개 소스로 이루어진 프로젝트를 찾아 보았다.

TinyXML 과  RapidXML 을 찾았는데 둘 중 가볍고 사용하기 편한 RapidXML 을 사용하기로 하였다.

RapidXML 소스를 받으면 4개의 소스 파일로만 이루어 졌다.

rapidxml.hpp
rapidxml_iterators.hpp
rapidxml_print.hpp
rapidxml_utils.hpp

rapidxml_print 는 XML을 출력하는 기능이 포함되어 있고. rapidxml_utils 은 XML 데이터 파일을 읽어들이는 기능을 한다.

기본적인 XML 데이터 탐색을 하기위해서는 rapidxml.hpp 만 포함시키면 된다.

기본적인 사용법은 아래의 소스를 보면 한눈에 알 수 있다.


#include "rapidxml.hpp"
#include "rapidxml_utils.hpp"
using namespace rapidxml;

// XML 문서 데이터를 저장할 변수
vector< TCHAR > xmlData;

// XML 파일 불러오기
basic_ifstream<TCHAR> xmlFile( strFile );
xmlFile.seekg(0, ios::end);
size_t size = xmlFile.tellg();
xmlFile.seekg(0);

xmlData.clear();
xmlData.resize( size + 1);
xmlData[size] = 0;

xmlFile.read( &xmlData.front(), (streamsize)size );

// XML Parsing
xml_document< TCHAR > xmlDoc;
xmlDoc.parse<0>( &xmlData.front() );

TCHAR* Name;
TCHAR* Value;
xml_node< TCHAR >* Item;
xml_node< TCHAR >* SubItem;
xml_attribute< TCHAR >* Attr;

// root 포인터
xml_node< TCHAR >* root = xmlDoc.first_node();

// root 하위 Node 탐색
for ( Item = root->first_node(); Item; Item = root->next_sibling())
{
// Node 이름
Name = Item->name();

// Node 의 Attribute 탐색
for ( Attr = Item->first_attribute(); Attr;
Attr = Attr->next_attribute() )
{
Name = Attr->name(); // Attribute 의 이름
Value = Attr->value(); // Attribute 의 값
}

for ( SubItem = Item->first_node(); SubItem;
SubItem = SubItem->next_sibling() )
{
Name = Attr->name(); // Sub node 의 이름
}
}

RapidXML 홈페이지
TinyXML 홈페이지

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