From 8f97e14738d3682f91327e6e51aa3a0fb1c67bc0 Mon Sep 17 00:00:00 2001 From: gcasa Date: Tue, 3 Jan 2012 17:15:29 +0000 Subject: [PATCH] * Source/NSXMLDocument.m: Change stack implementation to use lastObject/removeLastObject to implement the stack instead of inserting and deleting at index 0. * Source/NSXMLElement.m: Implemented XMLStringWithOptions: * Source/NSXMLNode.m: Implemented XMLStringWithOptions:, skeletal implementation of setStringValue:resolvingEntities: git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34403 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 9 +++++++++ Source/NSXMLDocument.m | 10 +++++----- Source/NSXMLElement.m | 36 ++++++++++++++++++++++++++++++++++++ Source/NSXMLNode.m | 26 ++++++++++++++++++++++++-- 4 files changed, 74 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index f8e87dfaa..59a16fd8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2012-01-03 12:06-EST Gregory John Casamento + + * Source/NSXMLDocument.m: Change stack implementation to + use lastObject/removeLastObject to implement the stack instead + of inserting and deleting at index 0. + * Source/NSXMLElement.m: Implemented XMLStringWithOptions: + * Source/NSXMLNode.m: Implemented XMLStringWithOptions:, + skeletal implementation of setStringValue:resolvingEntities: + 2012-01-03 Fred Kiefer * Source/NSException.m (-raise): Only set the stack when the diff --git a/Source/NSXMLDocument.m b/Source/NSXMLDocument.m index 41fe2a03a..72e083c0e 100644 --- a/Source/NSXMLDocument.m +++ b/Source/NSXMLDocument.m @@ -95,6 +95,7 @@ ASSIGN(_xmlData, data); [parser setDelegate: self]; [parser parse]; + RELEASE(parser); } } return self; @@ -294,8 +295,7 @@ NSXMLElement *currentElement = [[NSXMLElement alloc] initWithName: elementName]; - [_elementStack insertObject: currentElement - atIndex: 0]; + [_elementStack addObject: currentElement]; if (_rootElement == nil) { [self setRootElement: currentElement]; @@ -312,10 +312,10 @@ { if ([_elementStack count] > 0) { - NSXMLElement *currentElement = [_elementStack objectAtIndex: 0]; + NSXMLElement *currentElement = [_elementStack lastObject]; if ([[currentElement name] isEqualToString: elementName]) { - [_elementStack removeObjectAtIndex: 0]; + [_elementStack removeLastObject]; } } } @@ -323,7 +323,7 @@ - (void) parser: (NSXMLParser *)parser foundCharacters: (NSString *)string { - NSXMLElement *currentElement = [_elementStack objectAtIndex: 0]; + NSXMLElement *currentElement = [_elementStack lastObject]; [currentElement setStringValue: string]; } @end diff --git a/Source/NSXMLElement.m b/Source/NSXMLElement.m index 973f07325..c954ac760 100644 --- a/Source/NSXMLElement.m +++ b/Source/NSXMLElement.m @@ -213,5 +213,41 @@ [self notImplemented: _cmd]; } +- (NSString *) XMLStringWithOptions: (NSUInteger)options +{ + NSMutableString *result = [NSMutableString string]; + NSEnumerator *en = nil; + id object = nil; + + // XML Element open tag... + [result appendString: [NSString stringWithFormat: @"<%@",[self name]]]; + + // get the attributes... + en = [[self attributes] objectEnumerator]; + while((object = [en nextObject]) != nil) + { + [result appendString: @" "]; + [result appendString: [object XMLStringWithOptions: options]]; + } + // close the brackets... + [result appendString: @">"]; + + [result appendString: [self stringValue]]; // need to escape entities... + + // Iterate over the children... + en = [[self children] objectEnumerator]; + while((object = [en nextObject]) != nil) + { + [result appendString: @" "]; + [result appendString: [object XMLStringWithOptions: options]]; + } + + // Close the entire tag... + [result appendString: [NSString stringWithFormat: @"",[self name]]]; + + // return + return result; +} + @end diff --git a/Source/NSXMLNode.m b/Source/NSXMLNode.m index 7f5693bb7..1d4ffc725 100644 --- a/Source/NSXMLNode.m +++ b/Source/NSXMLNode.m @@ -488,7 +488,22 @@ GS_PRIVATE_INTERNAL(NSXMLNode) - (NSString*) XMLStringWithOptions: (NSUInteger)options { - return [self notImplemented: _cmd]; // FIXME ... generate from libxml + NSMutableString *returnValue = [NSMutableString string]; + NSXMLNodeKind kind = [self kind]; + + if(kind == NSXMLAttributeKind) + { + [returnValue appendString: [self name]]; + [returnValue appendString: @"=\""]; + [returnValue appendString: [self stringValue]]; + [returnValue appendString: @"\""]; + } + else + { + // for all other types, do nothing for now... + } + + return returnValue; } - (void) setObjectValue: (id)value @@ -513,7 +528,14 @@ GS_PRIVATE_INTERNAL(NSXMLNode) - (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve { - [self notImplemented: _cmd]; // FIXME ... set in libxml + if(resolve == NO) + { + ASSIGN(_objectValue, string); + } + else + { + ASSIGN(_objectValue, string); // need to actually resolve entities... + } } - (NSString*) XPath