diff --git a/Source/NSXMLDocument.m b/Source/NSXMLDocument.m index 7c9858677..499af2d73 100644 --- a/Source/NSXMLDocument.m +++ b/Source/NSXMLDocument.m @@ -208,17 +208,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) - (void) setRootElement: (NSXMLNode*)root { -/* - NSArray *children; - - NSAssert(root == nil, NSInvalidArgumentException); - - // this method replaces *all* children with the specified element. - children = [[NSArray alloc] initWithObjects: &root count: 1]; - [self setChildren: children]; - [children release]; - internal->rootElement = (NSXMLElement*)root; -*/ +#warning properly dispose of old root element. xmlNodePtr newrootnode; NSAssert(root != nil, NSInvalidArgumentException); // Set @@ -258,7 +248,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument) NSXMLNodeKind kind; NSAssert(nil != child, NSInvalidArgumentException); - NSAssert(index <= internal->childCount, NSInvalidArgumentException); + NSAssert(index <= [self childCount], NSInvalidArgumentException); NSAssert(nil == [child parent], NSInvalidArgumentException); kind = [child kind]; NSAssert(NSXMLAttributeKind != kind, NSInvalidArgumentException); diff --git a/Source/NSXMLElement.m b/Source/NSXMLElement.m index aeeea2f97..88d7f5629 100644 --- a/Source/NSXMLElement.m +++ b/Source/NSXMLElement.m @@ -269,22 +269,17 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (void) removeChildAtIndex: (NSUInteger)index { NSXMLNode *child; + xmlNodePtr n; - if (index >= internal->childCount) + if (index >= [self childCount]) { [NSException raise: NSRangeException format: @"index to large"]; } - child = [internal->children objectAtIndex: index]; - GSIVar(child, parent) = nil; - [internal->children removeObjectAtIndex: index]; - if (0 == --internal->childCount) - { - /* The -children method must return nil if there are no children, - * so we destroy the container. - */ - DESTROY(internal->children); - } + + child = [[self children] objectAtIndex: index]; + n = [child _node]; + xmlUnlinkNode(n); } - (void) setChildren: (NSArray*)children @@ -310,7 +305,8 @@ GS_PRIVATE_INTERNAL(NSXMLElement) - (void) addChild: (NSXMLNode*)child { - [self insertChild: child atIndex: internal->childCount]; + int count = [self childCount]; + [self insertChild: child atIndex: count]; } - (void) replaceChildAtIndex: (NSUInteger)index withNode: (NSXMLNode*)node diff --git a/Source/NSXMLNode.m b/Source/NSXMLNode.m index facc5eb24..62246d1d0 100644 --- a/Source/NSXMLNode.m +++ b/Source/NSXMLNode.m @@ -51,39 +51,61 @@ GS_PRIVATE_INTERNAL(NSXMLNode) + (NSXMLNode *) _objectForNode: (xmlNodePtr)node { - if (!node) - return nil; - - xmlElementType type = node->type; - NSXMLNode *result = (id)node->_private; - xmlChar *name = NULL; - // NSXMLNodeKind kind = 0; - - if(result == NULL) + NSXMLNode *result = nil; + + if (node) { - NSXMLNode *parent = nil; - switch(type) + xmlElementType type = node->type; + xmlChar *name = NULL; + // NSXMLNodeKind kind = 0; + + if(result == NULL) { - case(XML_ELEMENT_NODE): - name = (xmlChar *)node->name; - result = [[self alloc] initWithKind: NSXMLElementKind]; + NSXMLNode *parent = nil; + switch(type) + { + case(XML_ELEMENT_NODE): + name = (xmlChar *)node->name; + result = [[self alloc] initWithKind: NSXMLElementKind]; + break; + case(XML_ATTRIBUTE_NODE): + name = (xmlChar *)node->name; + result = [[self alloc] initWithKind: NSXMLAttributeKind]; + [result setStringValue: StringFromXMLStringPtr(node->content)]; + break; + default: + break; + } + node->_private = result; + AUTORELEASE(result); + if (node->parent) + parent = [self _objectForNode:node->parent]; + [parent _addSubNode:result]; + } + } + + return result; +} + ++ (xmlNodePtr) _nodeForObject: (NSXMLNode *)object +{ + xmlNodePtr node = NULL; + if(object) + { + NSXMLNodeKind kind = [object kind]; + switch (kind) + { + case(NSXMLAttributeKind): + node = xmlNewProp(NULL, + XMLSTRING([object name]), + XMLSTRING([object stringValue])); break; - case(XML_ATTRIBUTE_NODE): - name = (xmlChar *)node->name; - result = [[self alloc] initWithKind: NSXMLAttributeKind]; - [result setStringValue: StringFromXMLStringPtr(node->content)]; - break; - default: + case(NSXMLElementKind): + node = xmlNewNode(NULL,XMLSTRING([object name])); break; } - node->_private = result; - AUTORELEASE(result); - if (node->parent) - parent = [self _objectForNode:node->parent]; - [parent _addSubNode:result]; } - - return result; + return node; } - (void) _addSubNode:(NSXMLNode *)subNode @@ -93,7 +115,6 @@ GS_PRIVATE_INTERNAL(NSXMLNode) if ([internal->subNodes indexOfObjectIdenticalTo:subNode] == NSNotFound) [internal->subNodes addObject:subNode]; } - @end @implementation NSXMLNode @@ -107,9 +128,6 @@ GS_PRIVATE_INTERNAL(NSXMLNode) n = [[[self alloc] initWithKind: NSXMLAttributeKind] autorelease]; [n setStringValue: stringValue]; [n setName: name]; - node = xmlNewProp(NULL, - XMLSTRING(name), - XMLSTRING(stringValue)); [n _setNode: node]; return n; @@ -283,18 +301,18 @@ GS_PRIVATE_INTERNAL(NSXMLNode) - (NSUInteger) childCount { - NSUInteger childCount = 0; + NSUInteger count = 0; xmlNodePtr children = NULL; - xmlNodePtr node = (xmlNodePtr)(internal->node); + xmlNodePtr node = MY_NODE; if (node->type == XML_DOCUMENT_NODE) node = xmlDocGetRootElement((xmlDocPtr)node); for (children = node->children; children; children = children->next) { - childCount++; + count++; } - return childCount; + return count; } - (NSArray*) children @@ -335,11 +353,8 @@ GS_PRIVATE_INTERNAL(NSXMLNode) if (GS_EXISTS_INTERNAL) { [self detach]; - [internal->name release]; [internal->URI release]; - [internal->children release]; [internal->objectValue release]; - [internal->stringValue release]; [internal->subNodes release]; GS_DESTROY_INTERNAL(NSXMLNode); } @@ -433,7 +448,6 @@ GS_PRIVATE_INTERNAL(NSXMLNode) */ internal->kind = kind; internal->options = theOptions; - internal->stringValue = @""; return self; } @@ -458,7 +472,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode) } s = [other name]; - if (s != internal->name && NO == [s isEqual: internal->name]) + if (s != [self name] && NO == [s isEqual: [self name]]) { return NO; } diff --git a/Source/NSXMLPrivate.h b/Source/NSXMLPrivate.h index d9d56db01..8d6affb33 100644 --- a/Source/NSXMLPrivate.h +++ b/Source/NSXMLPrivate.h @@ -81,7 +81,9 @@ StringFromXMLString(const unsigned char *bytes, unsigned length) } #define MY_DOC ((xmlDoc *)internal->node) - +#define MY_NODE ((xmlNode *)internal->node) +#define MY_ATTR ((xmlAttr *)internal->node) +#define MY_ELEM ((xmlElement *)internal->node) /* Instance variables for NSXMLNode. This macro needs to be defined before * the NSXMLNode.h header is imported and before GSInternal.h is imported. @@ -103,11 +105,7 @@ StringFromXMLString(const unsigned char *bytes, unsigned length) NSXMLNode *parent; \ NSUInteger index; \ id objectValue; \ - NSString *stringValue; \ - NSString *name; \ NSString *URI; \ - NSMutableArray *children; \ - NSUInteger childCount; \ NSXMLNode *previousSibling; \ NSXMLNode *nextSibling;\ NSUInteger options; \