|
LOCAL loXMLAdapter, loBrowser, lcXSD, lcATOMContent, lcXMLHeader, lcXMLFooter
lcXMLHeader = GetHeader() lcXSD = VFPATOMSchema() *!* Atom .02 feed, need to dig into 1.0 specification http://ietfreport.isoc.org/idref/draft-ietf-atompub-format/ lcATOMContent = RetrieveATOM("http://www.sweetpotatosoftware.com/SPSBlog/SyndicationServiceExperimental.asmx/GetAtom") lcXMLFooter = GetFooter()
oXMLAdapter = NEWOBJECT('XMLAdapter')
oXMLAdapter.LOADXML(lcXMLHeader + lcXSD+ lcATOMContent + lcXMLFooter)
CLOSE DATABASES ALL oXMLAdapter.TABLES(1).TOCURSOR && Generator oXMLAdapter.TABLES(2).TOCURSOR && Author oXMLAdapter.TABLES(3).ToCursor && Entry oXMLAdapter.TABLES(4).ToCursor && Feed SET
***************************** FUNCTION GetHeader() ***************************** LOCAL lcHeader TEXT TO lcHeader NOSHOW <?xml version="1.0" encoding="utf-8" ?> <VFPDataSet> ENDTEXT RETURN lcHeader ENDFUNC
***************************** FUNCTION GetFooter() ***************************** LOCAL lcFooter TEXT TO lcFooter NOSHOW </VFPDataSet> ENDTEXT RETURN lcFooter ENDFUNC
***************************** FUNCTION VFPATOMSchema() ***************************** LOCAL lcXML *!* Use bare minimum abbreviated notation to show all that is necessary TEXT TO lcXML NOSHOW <xsd:schema xmlns:tns="http://purl.org/atom/ns#" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://purl.org/atom/ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:element name="feed"> <xsd:complexType> <xsd:sequence> <xsd:element name="title" type="xsd:string" /> <xsd:element name="link" type="xsd:string" /> <xsd:element name="modified" type="xsd:dateTime" /> <xsd:element name="tagline" type="xsd:string" /> <xsd:element name="generator"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="name" type="xsd:string" use="required" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> <xsd:element name="author"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element maxOccurs="unbounded" name="entry"> <xsd:complexType> <xsd:sequence> <xsd:element name="title" type="xsd:string" /> <xsd:element name="link" type="xsd:string" /> <xsd:element name="id" type="xsd:string" /> <xsd:element name="issued" type="xsd:dateTime" /> <xsd:element name="modified" type="xsd:dateTime" /> <xsd:element name="created" type="xsd:dateTime" /> <xsd:element name="content" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="version" type="xsd:decimal" use="required" /> </xsd:complexType> </xsd:element> </xsd:schema> ENDTEXT RETURN lcXML ENDFUNC
***************************** FUNCTION RetrieveATOM(tcURL) ***************************** #DEFINE INTERNET_OPEN_TYPE_PRECONFIG 0 #DEFINE SYNCHRONOUS 0 #DEFINE INTERNET_FLAG_RELOAD 2147483648
DECLARE INTEGER InternetOpen IN WININET STRING Agent, ; INTEGER AccessType, STRING ProxyName, ; STRING ProxyBypass, INTEGER Flags
DECLARE INTEGER InternetOpenUrl IN WININET ; INTEGER hInternetSession, STRING Url, STRING Header, ; INTEGER HeaderLength, INTEGER Flags, INTEGER Context
DECLARE INTEGER InternetReadFile IN WININET INTEGER file, ; STRING @Buffer, INTEGER NumberOfBytesToRead, INTEGER @BytesRead
DECLARE SHORT InternetCloseHandle IN WININET INTEGER hInst
LOCAL lcAgent, lhInternetSession, lhFile, llOK, lnReturn, lcReadBuffer, lnBytesRead, lcRetVal
lcAgent = "VFP ATOM 0.2 Reader" lhInternetSession = InternetOpen(lcAgent, INTERNET_OPEN_TYPE_PRECONFIG, "", "", SYNCHRONOUS)
IF lhInternetSession = 0 ? "Problem Encountered: Internet session cannot be established" ELSE lhFile = InternetOpenUrl( lhInternetSession, tcURL, '', 0, INTERNET_FLAG_RELOAD, 0) IF lhFile = 0 ? "Problem Encountered: URL cannot be opened" ELSE lcRetVal = "" llOK = .T. DO WHILE llOK lcReadBuffer = SPACE(1500) lnBytesRead = 0 lnReturn = InternetReadFile(lhFile, @lcReadBuffer, LEN(lcReadBuffer), @lnBytesRead) IF (lnBytesRead > 0) lcRetVal = lcRetVal + LEFT(lcReadBuffer, lnBytesRead) ENDIF llOK = (lnReturn = 1 AND lnBytesRead > 0) ENDDO InternetCloseHandle(lhFile) InternetCloseHandle(lhInternetSession) lcRetVal = SUBSTR(lcRetVal, ATC("<feed", lcRetVal)) RETURN LEFT(lcRetVal, ATC("</feed>", lcRetVal) + 9) ENDIF ENDIF RETURN "" ENDFUNC |