diff --git a/ChangeLog b/ChangeLog index e225a7f87..318590f6c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-02-22 Fred Kiefer + + * Source/NSXMLNode.m (-_nodeFollowingInNaturalDirection:): Correct + this method. + * Source/NSXMLDocument.m, + * Source/NSXMLElement.m: Clean up children methods. + 2012-02-22 Fred Kiefer * Source/NSXMLNode.m: Further clean up. diff --git a/Source/NSXMLDocument.m b/Source/NSXMLDocument.m index 7a521b1ed..007739d20 100644 --- a/Source/NSXMLDocument.m +++ b/Source/NSXMLDocument.m @@ -331,34 +331,28 @@ extern void clearPrivatePointers(xmlNodePtr aNode); - (void) removeChildAtIndex: (NSUInteger)index { - NSXMLNode *child; - xmlNodePtr n; + NSXMLNode *child; if (index >= [self childCount]) { [NSException raise: NSRangeException - format: @"index too large"]; + format: @"index too large"]; } - child = [[self children] objectAtIndex: index]; - n = [child _node]; - xmlUnlinkNode(n); + child = [self childAtIndex: index]; + [child detach]; } - (void) setChildren: (NSArray*)children { - NSEnumerator *en; - NSXMLNode *child; - - while ([self childCount] > 0) + NSUInteger count = [self childCount]; + + while (count-- > 0) { - [self removeChildAtIndex: [self childCount] - 1]; - } - en = [[self children] objectEnumerator]; - while ((child = [en nextObject]) != nil) - { - [self insertChild: child atIndex: [self childCount]]; + [self removeChildAtIndex: count]; } + + [self insertChildren: children atIndex: 0]; } - (void) addChild: (NSXMLNode*)child @@ -448,38 +442,33 @@ extern void clearPrivatePointers(xmlNodePtr aNode); arguments: (NSDictionary*)arguments error: (NSError**)error { -#ifdef HAVE_LIBXSLT NSData *data = [[NSData alloc] initWithBytes: [xslt UTF8String] length: [xslt length]]; - NSXMLDocument *result = [self objectByApplyingXSLT: data - arguments: arguments - error: error]; + NSXMLDocument *result = [self objectByApplyingXSLT: data + arguments: arguments + error: error]; [data release]; return result; -#else - return nil; -#endif } - (id) objectByApplyingXSLTAtURL: (NSURL*)xsltURL arguments: (NSDictionary*)arguments error: (NSError**)error { -#ifdef HAVE_LIBXSLT NSData *data = [NSData dataWithContentsOfURL: xsltURL]; - NSXMLDocument *result = [self objectByApplyingXSLT: data - arguments: arguments - error: error]; + NSXMLDocument *result = [self objectByApplyingXSLT: data + arguments: arguments + error: error]; return result; -#else - return nil; -#endif } - (BOOL) validateAndReturnError: (NSError**)error { xmlValidCtxtPtr ctxt = xmlNewValidCtxt(); + // FIXME: Should use xmlValidityErrorFunc and userData + // to get the error BOOL result = (BOOL)(xmlValidateDocument(ctxt, MY_DOC)); + xmlFreeValidCtxt(ctxt); return result; } @@ -494,7 +483,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); - (BOOL) isEqual: (id)other { - if(self == other) + if (self == other) { return YES; } diff --git a/Source/NSXMLElement.m b/Source/NSXMLElement.m index 8da8dfcdf..e338b7f48 100644 --- a/Source/NSXMLElement.m +++ b/Source/NSXMLElement.m @@ -123,19 +123,17 @@ extern void clearPrivatePointers(xmlNodePtr aNode); error: (NSError**)error { NSXMLElement *result = nil; - if((self = [super init]) != nil) + NSXMLDocument *tempDoc = + [[NSXMLDocument alloc] initWithXMLString: string + options: 0 + error: error]; + if (tempDoc != nil) { - NSXMLDocument *tempDoc = - [[NSXMLDocument alloc] initWithXMLString:string - options:0 - error:error]; - if(tempDoc != nil) - { - result = RETAIN([tempDoc rootElement]); - [result detach]; // detach from document. - } - [tempDoc release]; + result = RETAIN([tempDoc rootElement]); + [result detach]; // detach from document. } + [tempDoc release]; + return result; } @@ -147,7 +145,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); for (cur = MY_NODE->children; cur != NULL; cur = cur->next) { NSString *n = StringFromXMLStringPtr(cur->name); - if([n isEqualToString: name]) + if ([n isEqualToString: name]) { NSXMLNode *node = (NSXMLNode *)(cur->_private); [results addObject: node]; @@ -333,23 +331,36 @@ extern void clearPrivatePointers(xmlNodePtr aNode); NSMutableArray *result = nil; xmlNsPtr ns = MY_NODE->ns; - if(ns) + if (ns) { xmlNsPtr cur = NULL; result = [NSMutableArray array]; - for(cur = ns; cur != NULL; cur = cur->next) + for (cur = ns; cur != NULL; cur = cur->next) { [result addObject: StringFromXMLStringPtr(cur->prefix)]; } } - // [self notImplemented: _cmd]; - return result; // nil; // internal->namespaces; + return result; } - (NSXMLNode*) namespaceForPrefix: (NSString*)name { - [self notImplemented: _cmd]; + xmlNsPtr ns = MY_NODE->ns; + + if (ns) + { + const xmlChar *prefix = XMLSTRING(name); + xmlNsPtr cur = NULL; + for (cur = ns; cur != NULL; cur = cur->next) + { + if (xmlStrcmp(prefix, cur->prefix) == 0) + { + return [NSXMLNode _objectForNode: (xmlNodePtr)cur]; + } + } + } + return nil; } @@ -383,7 +394,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); NSAssert(NSXMLNamespaceKind != kind, NSInvalidArgumentException); NSAssert(NSXMLNotationDeclarationKind != kind, NSInvalidArgumentException); - [self _insertChild:child atIndex:index]; + [self _insertChild: child atIndex: index]; } - (void) insertChildren: (NSArray*)children atIndex: (NSUInteger)index @@ -399,41 +410,33 @@ extern void clearPrivatePointers(xmlNodePtr aNode); - (void) removeChildAtIndex: (NSUInteger)index { - NSXMLNode *child; - xmlNodePtr n; + NSXMLNode *child; if (index >= [self childCount]) { [NSException raise: NSRangeException - format: @"index too large"]; + format: @"index too large"]; } - child = [[self children] objectAtIndex: index]; - n = [child _node]; - xmlUnlinkNode(n); - [self _removeSubNode:child]; + child = [self childAtIndex: index]; + [child detach]; } - (void) setChildren: (NSArray*)children { - NSEnumerator *en; - NSXMLNode *child; + NSUInteger count = [self childCount]; - while ([self childCount] > 0) + while (count-- > 0) { - [self removeChildAtIndex: [self childCount] - 1]; - } - en = [[self children] objectEnumerator]; - while ((child = [en nextObject]) != nil) - { - [self insertChild: child atIndex: [self childCount]]; + [self removeChildAtIndex: count]; } + + [self insertChildren: children atIndex: 0]; } - (void) addChild: (NSXMLNode*)child { - int count = [self childCount]; - [self insertChild: child atIndex: count]; + [self insertChild: child atIndex: [self childCount]]; } - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node diff --git a/Source/NSXMLNode.m b/Source/NSXMLNode.m index e4dc0c063..4e19e521e 100644 --- a/Source/NSXMLNode.m +++ b/Source/NSXMLNode.m @@ -1192,8 +1192,9 @@ NSArray *execute_xpath(NSXMLNode *node, - (NSXMLNode*) _nodeFollowingInNaturalDirection: (BOOL)forward { - NSXMLNode *ancestor = internal->parent; + NSXMLNode *ancestor = self; NSXMLNode *candidate = nil; + NSXMLNodeKind kind; /* Node walking is a depth-first thingy. Hence, we consider children first: */ if (0 != [self childCount]) @@ -1207,18 +1208,6 @@ NSArray *execute_xpath(NSXMLNode *node, } /* If there are no children, we move on to siblings: */ - if (nil == candidate) - { - if (forward) - { - candidate = internal->nextSibling; - } - else - { - candidate = internal->previousSibling; - } - } - /* If there are no siblings left for the receiver, we recurse down to the root * of the tree until we find an ancestor with further siblings: */ while ((nil == candidate) && (nil != ancestor)) @@ -1231,7 +1220,7 @@ NSArray *execute_xpath(NSXMLNode *node, { candidate = [ancestor previousSibling]; } - ancestor = GSIVar(ancestor, parent); + ancestor = [ancestor parent]; } /* No children, no next siblings, no next siblings for any ancestor: We are @@ -1242,8 +1231,8 @@ NSArray *execute_xpath(NSXMLNode *node, } /* Sanity check: Namespace and attribute nodes are skipped: */ - if ((NSXMLAttributeKind == GSIVar(candidate, kind)) - || (NSXMLNamespaceKind == GSIVar(candidate, kind))) + kind = [candidate kind]; + if ((NSXMLAttributeKind == kind) || (NSXMLNamespaceKind == kind)) { return [candidate _nodeFollowingInNaturalDirection: forward]; } @@ -1257,14 +1246,7 @@ NSArray *execute_xpath(NSXMLNode *node, - (NSXMLNode*) nextSibling { - xmlNodePtr next = MY_NODE->next; - - if (next != NULL) - { - return [NSXMLNode _objectForNode: next]; - } - - return nil; + return [NSXMLNode _objectForNode: MY_NODE->next]; } - (id) objectValue @@ -1289,21 +1271,12 @@ NSArray *execute_xpath(NSXMLNode *node, - (NSXMLNode*) previousSibling { - xmlNodePtr prev = MY_NODE->prev; - - if(prev != NULL) - { - return [NSXMLNode _objectForNode: prev]; - } - - return nil; + return [NSXMLNode _objectForNode: MY_NODE->prev]; } - (NSXMLDocument*) rootDocument { - xmlNodePtr node = MY_NODE; - NSXMLDocument *ancestor = (NSXMLDocument *)[NSXMLNode _objectForNode: (xmlNodePtr)(node->doc)]; - return ancestor; + return (NSXMLDocument *)[NSXMLNode _objectForNode: (xmlNodePtr)(MY_NODE->doc)]; } - (NSString*) stringValue @@ -1326,15 +1299,6 @@ NSArray *execute_xpath(NSXMLNode *node, return result; } -- (NSString*) URI -{ - if(NSXMLInvalidKind == internal->kind) - { - return nil; - } - return internal->URI; // FIXME ... fetch from libxml -} - - (void) setObjectValue: (id)value { if(nil == value) @@ -1362,6 +1326,12 @@ NSArray *execute_xpath(NSXMLNode *node, - (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve { xmlNodePtr node = MY_NODE; + + if (nil == string) + { + // string value may not be nil + string = @""; + } if (resolve == NO) { xmlNodeSetContent(node, XMLSTRING(string)); @@ -1369,14 +1339,11 @@ NSArray *execute_xpath(NSXMLNode *node, else { // need to actually resolve entities... - xmlChar *newstr = xmlEncodeSpecialChars(node->doc, XMLSTRING(string)); // is this the right functionality?? + // is this the right functionality?? + xmlChar *newstr = xmlEncodeSpecialChars(node->doc, XMLSTRING(string)); xmlNodeSetContent(node, newstr); xmlMemFree(newstr); } - if (nil == string) - { - xmlNodeSetContent(node, XMLSTRING(@"")); // string value may not be nil - } } - (void) setURI: (NSString*)URI @@ -1387,9 +1354,18 @@ NSArray *execute_xpath(NSXMLNode *node, } } +- (NSString*) URI +{ + if(NSXMLInvalidKind == internal->kind) + { + return nil; + } + return internal->URI; // FIXME ... fetch from libxml +} + - (NSString*) XMLString { - return [self XMLStringWithOptions: 0]; + return [self XMLStringWithOptions: NSXMLNodeOptionsNone]; } - (NSString*) XMLStringWithOptions: (NSUInteger)options @@ -1403,6 +1379,11 @@ NSArray *execute_xpath(NSXMLNode *node, int len = 0; error = xmlNodeDump(buffer, doc, node, 1, 1); + if (-1 == error) + { + xmlBufferFree(buffer); + return nil; + } buf = buffer->content; len = buffer->use; string = StringFromXMLString(buf,len);