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];
32 - (xmlDocPtr)nativeDoc {
40 [errorMessage release];
43 xmlFreeDoc(parsedXmlDoc);
52 - (void)setErrorMessage:(NSString *)message {
54 [errorMessage setString:message];
64 - (NSString *)errorMessage {
71 - (void)setErrorOccurred:(BOOL)flag {
77 - (void)appendErrorMessage:(NSString *)message {
79 if ([errorMessage length] > 0) {
80 [errorMessage appendString:@"\n"];
82 [errorMessage appendString:[message substringWithRange:NSMakeRange(0, [message length] - 1)]];
83 [self setErrorOccurred:YES];
87 - (BOOL)errorOccurred {
94 - (void)setError:(NSString *)message atLine:(int)line {
96 [self setErrorMessage:message];
98 [self setErrorOccurred:YES];
106 [errorMessage setString:@""];
107 [self setErrorOccurred:NO];
113 void makeUnixLineFeeds(char *buffer) {
117 while (buffer[i] != '\0') {
119 if (buffer[i] == '\r') {
120 if (buffer[i + 1] == '\n') {
132 - (BOOL)checkWellFormedString:(NSString *)xmlCode {
134 char *xmlString = (char *)[xmlCode cString];
135 //const char *xmlString = [stringData bytes];
138 makeUnixLineFeeds(xmlString);
141 NSData *stringData = [xmlCode dataUsingEncoding:NSUTF8StringEncoding];
142 NSData *stringData = [xmlCode dataUsingEncoding:NSISOLatin1StringEncoding];
145 xmlString = malloc([stringData length] + 1);
146 [stringData getBytes:xmlString];
147 xmlString[[stringData length]] = '\0';
151 xmlContext = xmlCreateDocParserCtxt(xmlString);
159 xmlSetGenericErrorFunc(self, (xmlGenericErrorFunc)XMLParserLibxml_xmlErrorHandler);
161 error = xmlParseDocument(xmlContext);
163 if (xmlContext->myDoc) {
164 xmlFreeDoc(xmlContext->myDoc);
167 xmlFreeParserCtxt(xmlContext);
170 if (error != XML_ERR_OK) {
183 - (BOOL)parseString:(NSString *)xmlCode {
185 char *xmlString = (char *)[xmlCode cString];
188 makeUnixLineFeeds(xmlString);
190 xmlContext = xmlCreateDocParserCtxt(xmlString);
192 xmlSubstituteEntitiesDefault(1);
193 xmlLoadExtDtdDefaultValue = 1;
201 xmlSetGenericErrorFunc(self, (xmlGenericErrorFunc)XMLParserLibxml_xmlErrorHandler);
203 error = xmlParseDocument(xmlContext);
207 xmlFreeDoc(parsedXmlDoc);
210 parsedXmlDoc = xmlContext->myDoc;
213 xmlFreeParserCtxt(xmlContext);
216 if (error != XML_ERR_OK) {
220 if ([self baseUri] != nil) {
221 xmlNodeSetBase((xmlNodePtr)parsedXmlDoc, (xmlChar *)[[self baseUri] cString]);
231 - (void)markFirstErrorLine {
233 if (errorLine == 0 && xmlContext && xmlContext->input) {
234 errorLine = xmlContext->input->line;
240 void XMLParserLibxml_xmlErrorHandler(id self, const char *message, ...) {
247 [self markFirstErrorLine];
249 /* we're only interested in messages with the format string "%s" */
250 if (strcmp(message, "%s")) {
254 va_start(args, message);
255 messageData = va_arg(args, char *);
257 [self appendErrorMessage:[NSString stringWithCString:messageData]];
265 void XMLParserLibxml_xmlErrorHandler2(id self, const char *message, ...) {
267 const char *end = message + (strlen(message) - 1);
268 char *pos = (char *)message;
270 NSString *errorMessage;
271 char completeMessage[512];
274 /* Do not overwrite previous error information so the
275 first error in a series will be preserved
277 if ([self errorOccurred]) {
281 // NSLog(@"xml error handler: %s", message);
283 va_start(args, message);
287 if (!strncmp(pos, "%s", 2)) {
288 va_arg(args, char *);
289 } else if (!strncmp(pos, "%d", 2)) {
290 errorLine = va_arg(args, int);
299 va_start(args, message);
300 vsnprintf(completeMessage, 512, message, args);
303 errorMessage = [NSString stringWithCString:completeMessage];
304 [self setError:errorMessage atLine:errorLine];
310 - (void)setBaseUri:(NSString *)uri {
317 - (NSString *)baseUri {