5 // Created by Marc Liyanage on Sun Aug 04 2002.
6 // Copyright (c) 2002 __MyCompanyName__. All rights reserved.
9 #import "XMLParserLibxml.h"
12 @implementation XMLParserLibxml
17 if (self = [super init]) {
19 errorMessage = [[NSMutableString alloc] init];
22 //xmlContext = malloc(sizeof(xmlParserCtxt));
23 //bzero(xmlContext, sizeof(xmlParserCtxt));
33 - (xmlDocPtr)nativeDoc {
41 [errorMessage release];
45 xmlFreeDoc(parsedXmlDoc);
55 - (void)setErrorMessage:(NSString *)message {
57 [errorMessage setString:message];
67 - (NSString *)errorMessage {
74 - (void)setErrorOccurred:(BOOL)flag {
80 - (void)appendErrorMessage:(NSString *)message {
82 if ([errorMessage length] > 0) {
83 [errorMessage appendString:@"\n"];
85 [errorMessage appendString:[message substringWithRange:NSMakeRange(0, [message length] - 1)]];
86 [self setErrorOccurred:YES];
90 - (BOOL)errorOccurred {
97 - (void)setError:(NSString *)message atLine:(int)line {
99 [self setErrorMessage:message];
101 [self setErrorOccurred:YES];
109 [errorMessage setString:@""];
110 [self setErrorOccurred:NO];
116 void makeUnixLineFeeds(char *buffer) {
120 while (buffer[i] != '\0') {
122 if (buffer[i] == '\r') {
123 if (buffer[i + 1] == '\n') {
136 - (BOOL)checkWellFormedData:(NSData *)xmlCode {
138 // fixme: using nsdata now, not null-terminated. maybe replace with expat.
140 char *xmlString = (char *)[xmlCode bytes];
141 //const char *xmlString = [stringData bytes];
144 makeUnixLineFeeds(xmlString);
147 NSData *stringData = [xmlCode dataUsingEncoding:NSUTF8StringEncoding];
148 NSData *stringData = [xmlCode dataUsingEncoding:NSISOLatin1StringEncoding];
151 xmlString = malloc([stringData length] + 1);
152 [stringData getBytes:xmlString];
153 xmlString[[stringData length]] = '\0';
157 // xmlContext = xmlCreateDocParserCtxt(xmlString);
165 xmlSetGenericErrorFunc(self, (xmlGenericErrorFunc)XMLParserLibxml_xmlErrorHandler);
167 error = xmlParseDocument(xmlContext);
169 if (xmlContext->myDoc) {
170 xmlFreeDoc(xmlContext->myDoc);
173 xmlFreeParserCtxt(xmlContext);
176 if (error != XML_ERR_OK) {
190 - (BOOL)parseData:(NSData *)xmlCode {
194 // makeUnixLineFeeds(xmlString);
196 xmlSubstituteEntitiesDefault(1);
197 xmlLoadExtDtdDefaultValue = 1;
200 xmlSetGenericErrorFunc(self, (xmlGenericErrorFunc)XMLParserLibxml_xmlErrorHandler);
203 xmlFreeDoc(parsedXmlDoc);
206 parsedXmlDoc = xmlParseMemory([xmlCode bytes], [xmlCode length]);
212 if ([self baseUri] != nil) {
213 xmlNodeSetBase((xmlNodePtr)parsedXmlDoc, (xmlChar *)[[self baseUri] cString]);
223 - (void)markFirstErrorLine {
225 // if (errorLine == 0 && xmlContext && xmlContext->input) {
226 // errorLine = xmlContext->input->line;
232 void XMLParserLibxml_xmlErrorHandler(id self, const char *message, ...) {
239 [self markFirstErrorLine];
241 /* we're only interested in messages with the format string "%s" */
242 if (strcmp(message, "%s")) {
246 va_start(args, message);
247 messageData = va_arg(args, char *);
249 [self appendErrorMessage:[NSString stringWithCString:messageData]];
257 void XMLParserLibxml_xmlErrorHandler2(id self, const char *message, ...) {
259 const char *end = message + (strlen(message) - 1);
260 char *pos = (char *)message;
262 NSString *errorMessage;
263 char completeMessage[512];
266 /* Do not overwrite previous error information so the
267 first error in a series will be preserved
269 if ([self errorOccurred]) {
273 // NSLog(@"xml error handler: %s", message);
275 va_start(args, message);
279 if (!strncmp(pos, "%s", 2)) {
280 va_arg(args, char *);
281 } else if (!strncmp(pos, "%d", 2)) {
282 errorLine = va_arg(args, int);
291 va_start(args, message);
292 vsnprintf(completeMessage, 512, message, args);
295 errorMessage = [NSString stringWithCString:completeMessage];
296 [self setError:errorMessage atLine:errorLine];
302 - (void)setBaseUri:(NSString *)uri {
309 - (NSString *)baseUri {