Revision: 27664
Updated Code
at June 19, 2010 16:01 by togino77
Updated Code
/* Add follow the path to search path of your project ${SDKROOT}/usr/include/libxml2 Add follow the framework to your project libxml2.dylib 1. Define your parse class with XMLDownloadParseDelegate protocol 2. Instance XMLDownloadParse with your parse class 3. Instance NSURLConnection and begin downloading 4. Call connection:didReceiveResponse: and connection:didReceiveData: corresponding to NSURLConnection delegate 5. Parse in your parse class as you like */ // XMLDownloadParse.h #import <Foundation/Foundation.h> #import <libxml/tree.h> struct _xmlElementTag { const unsigned char *localneme; const unsigned char *prefix; const unsigned char *URI; }; struct _xmlElementTagNamespaces { int nb_namespaces; const unsigned char **namespaces; int nb_attributes; int nb_defaulted; const unsigned char **attributes; }; typedef struct _xmlElementTag xmlElementTag; typedef struct _xmlElementTagNamespaces xmlElementTagNamespaces; @protocol XMLDownloadParseDelegate - (void)startElementTag:(xmlElementTag *)tag WithNamespaces:(xmlElementTagNamespaces *)tagNamespace; - (void)endElementTag:(xmlElementTag *)tag; - (void)charactersFound:(const unsigned char *)ch len:(int)len; @end @interface XMLDownloadParse : NSObject { xmlParserCtxtPtr ptrContext; id<XMLDownloadParseDelegate> delegate; } @property(nonatomic, retain) id<XMLDownloadParseDelegate> delegate; - (id)initWithDelegate:(id<XMLDownloadParseDelegate>)aDelegate; - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; - (void)startElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI nb_namespaces:(int)nb_namespaces namespaces:(const xmlChar **)namespaces nb_attributes:(int)nb_attributes nb_defaulted:(int)nb_defaulted attributes:(const xmlChar **)attributes; - (void)endElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI; - (void)charactersFound:(const xmlChar *)ch len:(int)len; @end // XMLDownloadParse.m #import "XMLDownloadParse.h" static void startElementHandler( void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes) { [(XMLDownloadParse*)ctx startElementLocalName:localname prefix:prefix URI:URI nb_namespaces:nb_namespaces namespaces:namespaces nb_attributes:nb_attributes nb_defaulted:nb_defaulted attributes:attributes]; } static void endElementHandler( void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI) { [(XMLDownloadParse*)ctx endElementLocalName:localname prefix:prefix URI:URI]; } static void charactersFoundHandler( void *ctx, const xmlChar *ch, int len) { [(XMLDownloadParse*)ctx charactersFound:ch len:len]; } static xmlSAXHandler _saxHandlerStruct = { NULL, /* internalSubset */ NULL, /* isStandalone */ NULL, /* hasInternalSubset */ NULL, /* hasExternalSubset */ NULL, /* resolveEntity */ NULL, /* getEntity */ NULL, /* entityDecl */ NULL, /* notationDecl */ NULL, /* attributeDecl */ NULL, /* elementDecl */ NULL, /* unparsedEntityDecl */ NULL, /* setDocumentLocator */ NULL, /* startDocument */ NULL, /* endDocument */ NULL, /* startElement*/ NULL, /* endElement */ NULL, /* reference */ charactersFoundHandler, /* characters */ NULL, /* ignorableWhitespace */ NULL, /* processingInstruction */ NULL, /* comment */ NULL, /* warning */ NULL, /* error */ NULL, /* fatalError //: unused error() get all the errors */ NULL, /* getParameterEntity */ NULL, /* cdataBlock */ NULL, /* externalSubset */ XML_SAX2_MAGIC, /* initialized */ NULL, /* private */ startElementHandler, /* startElementNs */ endElementHandler, /* endElementNs */ NULL, /* serror */ }; @implementation XMLDownloadParse @synthesize delegate; - (id)initWithDelegate:(id<XMLDownloadParseDelegate>)aDelegate{ if (self = [super init]) { self.delegate = aDelegate; } return self; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { if (ptrContext) { xmlFreeParserCtxt(ptrContext); } ptrContext = xmlCreatePushParserCtxt(&_saxHandlerStruct,self,NULL,0,NULL); } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { xmlParseChunk(ptrContext, (const char *)[data bytes], [data length], 0); } - (void)dealloc { self.delegate = nil; if (ptrContext) { xmlFreeParserCtxt(ptrContext); ptrContext = NULL; } [super dealloc]; } - (void)startElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI nb_namespaces:(int)nb_namespaces namespaces:(const xmlChar **)namespaces nb_attributes:(int)nb_attributes nb_defaulted:(int)nb_defaulted attributes:(const xmlChar **)attributes { xmlElementTag tag; tag.localneme = localname; tag.prefix = prefix; tag.URI = URI; xmlElementTagNamespaces tagName; tagName.nb_namespaces = nb_namespaces; tagName.namespaces = namespaces; tagName.nb_attributes = nb_attributes; tagName.nb_defaulted = nb_defaulted; tagName.attributes = attributes; [self.delegate startElementTag:&tag WithNamespaces:&tagName]; } - (void)endElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI { xmlElementTag tag; tag.localneme = localname; tag.prefix = prefix; tag.URI = URI; [self.delegate endElementTag:&tag]; } - (void)charactersFound:(const xmlChar *)ch len:(int)len { [self.delegate charactersFound:ch len:len]; } @end
Revision: 27663
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at June 19, 2010 15:55 by togino77
Initial Code
/* Add follow the path to search path of your project ${SDKROOT}/usr/include/libxml2 Add follow the framework to your project libxml2.dylib 1. Define your parse class with XMLDownloadParseDelegate protocol 2. Instance XMLDownloadParse with your parse class 3. Instance NSURLConnection and begin downloading 4. Call connection:didReceiveResponse: and connection:didReceiveData: corresponding to NSURLConnection delegate 5. Parse in your parse class as you like */ // XMLDownloadParse.h #import <Foundation/Foundation.h> #import <libxml/tree.h> struct _xmlElementTag { const unsigned char *localneme; const unsigned char *prefix; const unsigned char *URI; }; struct _xmlElementTagNamespaces { int nb_namespaces; const unsigned char **namespaces; int nb_attributes; int nb_defaulted; const unsigned char **attributes; }; typedef struct _xmlElementTag xmlElementTag; typedef struct _xmlElementTagNamespaces xmlElementTagNamespaces; @protocol XMLDownloadParseDelegate - (void)startElementTag:(xmlElementTag *)tag WithNamespaces:(xmlElementTagNamespaces *)tagNamespace; - (void)endElementTag:(xmlElementTag *)tag; - (void)charactersFound:(const unsigned char *)ch len:(int)len; @end @interface XMLDownloadParse : NSObject { xmlParserCtxtPtr ptrContext; id<XMLDownloadParseDelegate> delegate; } @property(nonatomic, retain) id<XMLDownloadParseDelegate> delegate; - (id)initWithDelegate:(id<XMLDownloadParseDelegate>)aDelegate; - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; - (void)startElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI nb_namespaces:(int)nb_namespaces namespaces:(const xmlChar **)namespaces nb_attributes:(int)nb_attributes nb_defaulted:(int)nb_defaulted attributes:(const xmlChar **)attributes; - (void)endElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI; - (void)charactersFound:(const xmlChar *)ch len:(int)len; @end // XMLDownloadParse.m #import "XMLDownloadParse.h" static void startElementHandler( void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes) { [(XMLDownloadParse*)ctx startElementLocalName:localname prefix:prefix URI:URI nb_namespaces:nb_namespaces namespaces:namespaces nb_attributes:nb_attributes nb_defaulted:nb_defaulted attributes:attributes]; } static void endElementHandler( void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI) { [(XMLDownloadParse*)ctx endElementLocalName:localname prefix:prefix URI:URI]; } static void charactersFoundHandler( void *ctx, const xmlChar *ch, int len) { [(XMLDownloadParse*)ctx charactersFound:ch len:len]; } static xmlSAXHandler _saxHandlerStruct = { NULL, /* internalSubset */ NULL, /* isStandalone */ NULL, /* hasInternalSubset */ NULL, /* hasExternalSubset */ NULL, /* resolveEntity */ NULL, /* getEntity */ NULL, /* entityDecl */ NULL, /* notationDecl */ NULL, /* attributeDecl */ NULL, /* elementDecl */ NULL, /* unparsedEntityDecl */ NULL, /* setDocumentLocator */ NULL, /* startDocument */ NULL, /* endDocument */ NULL, /* startElement*/ NULL, /* endElement */ NULL, /* reference */ charactersFoundHandler, /* characters */ NULL, /* ignorableWhitespace */ NULL, /* processingInstruction */ NULL, /* comment */ NULL, /* warning */ NULL, /* error */ NULL, /* fatalError //: unused error() get all the errors */ NULL, /* getParameterEntity */ NULL, /* cdataBlock */ NULL, /* externalSubset */ XML_SAX2_MAGIC, /* initialized */ NULL, /* private */ startElementHandler, /* startElementNs */ endElementHandler, /* endElementNs */ NULL, /* serror */ }; @implementation XMLDownloadParse @synthesize delegate; - (id)initWithDelegate:(id<XMLDownloadParseDelegate>)aDelegate{ if (self = [super init]) { self.delegate = aDelegate; } return self; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { if (ptrContext) { xmlFreeParserCtxt(ptrContext); } ptrContext = xmlCreatePushParserCtxt(&_saxHandlerStruct,self,NULL,0,NULL); } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { xmlParseChunk(ptrContext, (const char *)[data bytes], [data length], 0); } - (void)dealloc { self.delegate = nil; if (ptrContext) { xmlFreeParserCtxt(ptrContext); ptrContext = NULL; } [super dealloc]; } - (void)startElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI nb_namespaces:(int)nb_namespaces namespaces:(const xmlChar **)namespaces nb_attributes:(int)nb_attributes nb_defaulted:(int)nb_defaulted attributes:(const xmlChar **)attributes { xmlElementTag tag; tag.localneme = localname; tag.prefix = prefix; tag.URI = URI; xmlElementTagNamespaces tagName; tagName.nb_namespaces = nb_namespaces; tagName.namespaces = namespaces; tagName.nb_attributes = nb_attributes; tagName.nb_defaulted = nb_defaulted; tagName.attributes = attributes; [self.delegate startElementTag:&tag WithNamespaces:&tagName]; } - (void)endElementLocalName:(const xmlChar *)localname prefix:(const xmlChar *)prefix URI:(const xmlChar *)URI { xmlElementTag tag; tag.localneme = localname; tag.prefix = prefix; tag.URI = URI; [self.delegate endElementTag:&tag]; } - (void)charactersFound:(const xmlChar *)ch len:(int)len { [self.delegate charactersFound:ch len:len]; } @end
Initial URL
Initial Description
Initial Title
Using libxml2 from NSURLConnection
Initial Tags
xml, iphone
Initial Language
Objective C