From daf08b99a4cfbb94224dff9f6e1df80ba8cecd01 Mon Sep 17 00:00:00 2001 From: Gregory John Casamento Date: Mon, 16 Jan 2012 18:31:17 +0000 Subject: [PATCH] * Source/NSXMLElement.m * Source/NSXMLNode.m: Corrections to make "basic" tests pass. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/branches/nsxml_using_libxml2@34556 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 5 ++ Source/NSXMLElement.m | 5 ++ Source/NSXMLNode.m | 123 +++++++++++++++++++++++++++--------------- 3 files changed, 89 insertions(+), 44 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9ac342f02..7f1d382f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-01-16 13:30-EST Gregory John Casamento + + * Source/NSXMLElement.m + * Source/NSXMLNode.m: Corrections to make "basic" tests pass. + 2012-01-15 10:48-EST Gregory John Casamento * Source/NSXMLNode.m diff --git a/Source/NSXMLElement.m b/Source/NSXMLElement.m index d7e168a52..2bd0f7364 100644 --- a/Source/NSXMLElement.m +++ b/Source/NSXMLElement.m @@ -44,6 +44,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); - (void) dealloc { + /* if (GS_EXISTS_INTERNAL && _internal != nil) { while ([self childCount] > 0) @@ -51,6 +52,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); [self removeChildAtIndex: [self childCount] - 1]; } } + */ [super dealloc]; } @@ -76,6 +78,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); internal->node = (void *)xmlNewNode(NULL,(xmlChar *)[name UTF8String]); ((xmlNodePtr)internal->node)->_private = self; internal->objectValue = @""; + // return self; } return [super initWithKind: kind options: theOptions]; } @@ -209,6 +212,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); [self notImplemented: _cmd]; } +/* - (void) setObjectValue: (id)value { if (nil == value) @@ -217,6 +221,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode); } ASSIGN(internal->objectValue, value); } +*/ - (NSArray*) namespaces { diff --git a/Source/NSXMLNode.m b/Source/NSXMLNode.m index 3a545e624..e2b978d3f 100644 --- a/Source/NSXMLNode.m +++ b/Source/NSXMLNode.m @@ -99,6 +99,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode) return result; } +/* + (xmlNodePtr) _nodeForObject: (NSXMLNode *)object { xmlNodePtr node = NULL; @@ -115,10 +116,14 @@ GS_PRIVATE_INTERNAL(NSXMLNode) case(NSXMLElementKind): node = xmlNewNode(NULL,XMLSTRING([object name])); break; + case(NSXMLInvalidKind): + node = xmlNewNode(NULL,XMLSTRING([object name])); + break; } } return node; } +*/ - (void) _addSubNode:(NSXMLNode *)subNode { @@ -198,10 +203,11 @@ int register_namespaces(xmlXPathContextPtr xpathCtx, return(0); } -NSArray *execute_xpath(xmlDocPtr doc, +NSArray *execute_xpath(NSXMLNode *node, NSString *xpath_exp, NSString *nmspaces) { + xmlDocPtr doc = ((xmlNodePtr)[node _node])->doc; NSMutableArray *result = [NSMutableArray arrayWithCapacity: 10]; xmlChar* xpathExpr = (xmlChar *)XMLSTRING(xpath_exp); xmlChar* nsList = (xmlChar *)XMLSTRING(nmspaces); @@ -467,16 +473,23 @@ NSArray *execute_xpath(xmlDocPtr doc, - (NSArray*) children { - NSMutableArray *childrenArray = [NSMutableArray array]; - xmlNodePtr children = NULL; - xmlNodePtr node = (xmlNodePtr)(internal->node); - - for (children = node->children; children; children = children->next) + NSMutableArray *childrenArray = nil; + if(NSXMLInvalidKind == internal->kind) { - NSXMLNode *n = [NSXMLNode _objectForNode: children]; - [childrenArray addObject: n]; + return nil; + } + else + { + xmlNodePtr children = NULL; + xmlNodePtr node = (xmlNodePtr)(internal->node); + + childrenArray = [NSMutableArray array]; + for (children = node->children; children; children = children->next) + { + NSXMLNode *n = [NSXMLNode _objectForNode: children]; + [childrenArray addObject: n]; + } } - return childrenArray; } @@ -504,11 +517,11 @@ NSArray *execute_xpath(xmlDocPtr doc, if (GS_EXISTS_INTERNAL) { xmlNodePtr node = (xmlNodePtr)(internal->node); - [self detach]; - node->_private = NULL; [internal->URI release]; [internal->objectValue release]; [internal->subNodes release]; + [self detach]; + xmlFree(node); GS_DESTROY_INTERNAL(NSXMLNode); } [super dealloc]; @@ -517,17 +530,13 @@ NSArray *execute_xpath(xmlDocPtr doc, - (void) detach { xmlNodePtr node = (xmlNodePtr)(internal->node); - xmlNodePtr parentNode = node->parent; - NSXMLNode *parent = (parentNode ? parentNode->_private : nil); // get our parent object if it exists - [parent _removeSubNode:self]; - xmlUnlinkNode(node); -/* - if (node->parent != nil) + if(node) { - [(NSXMLElement*)internal->parent removeChildAtIndex: internal->index]; - internal->parent = nil; + xmlNodePtr parentNode = node->parent; + NSXMLNode *parent = (parentNode ? parentNode->_private : nil); // get our parent object if it exists + [parent _removeSubNode:self]; + xmlUnlinkNode(node); } -*/ } - (NSUInteger) hash @@ -561,6 +570,7 @@ NSArray *execute_xpath(xmlDocPtr doc, - (id) initWithKind: (NSXMLNodeKind)kind options: (NSUInteger)theOptions { Class theSubclass = [NSXMLNode class]; + void *node = NULL; if (nil == (self = [super init])) { @@ -572,26 +582,30 @@ NSArray *execute_xpath(xmlDocPtr doc, */ switch (kind) { - case NSXMLDocumentKind: - theSubclass = [NSXMLDocument class]; - break; - - case NSXMLElementKind: - theSubclass = [NSXMLElement class]; - break; - - case NSXMLDTDKind: - theSubclass = [NSXMLDTD class]; - break; - - case NSXMLEntityDeclarationKind: - case NSXMLElementDeclarationKind: - case NSXMLNotationDeclarationKind: - theSubclass = [NSXMLDTDNode class]; - break; - - default: - break; + case NSXMLDocumentKind: + node = xmlNewDoc((xmlChar *)"1.0"); + theSubclass = [NSXMLDocument class]; + break; + + case NSXMLInvalidKind: + case NSXMLElementKind: + node = xmlNewNode(NULL,(xmlChar *)""); + theSubclass = [NSXMLElement class]; + break; + + case NSXMLDTDKind: + node = xmlNewDtd(NULL, NULL, NULL,NULL); + theSubclass = [NSXMLDTD class]; + break; + + case NSXMLEntityDeclarationKind: + case NSXMLElementDeclarationKind: + case NSXMLNotationDeclarationKind: + theSubclass = [NSXMLDTDNode class]; + break; + + default: + break; } /* @@ -608,7 +622,11 @@ NSArray *execute_xpath(xmlDocPtr doc, /* Create holder for internal instance variables if needed. */ - GS_CREATE_INTERNAL(NSXMLNode) + GS_CREATE_INTERNAL(NSXMLNode); + + /* Create libxml object to go with it... + */ + [self _setNode: node]; /* If we are initializing for the correct class, we can actually perform * initializations: @@ -684,6 +702,10 @@ NSArray *execute_xpath(xmlDocPtr doc, - (NSString*) name { + if(NSXMLInvalidKind == internal->kind) + { + return nil; + } return StringFromXMLStringPtr(MY_NODE->name); } @@ -806,15 +828,28 @@ NSArray *execute_xpath(xmlDocPtr doc, - (NSString*) stringValue { xmlNodePtr node = MY_NODE; - if (node->type == XML_ATTRIBUTE_NODE) + xmlChar *content = xmlNodeGetContent(node); + NSString *result = nil; + + /* + if (node->type == XML_ATTRIBUTE_NODE || + node->type == XML_ELEMENT_NODE) { node = node->children; } - return StringFromXMLStringPtr(node->content); + */ + + result = StringFromXMLStringPtr(content); + + return result; } - (NSString*) URI { + if(NSXMLInvalidKind == internal->kind) + { + return nil; + } return internal->URI; // FIXME ... fetch from libxml } @@ -897,7 +932,7 @@ NSArray *execute_xpath(xmlDocPtr doc, - (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error { *error = NULL; - return execute_xpath(MY_NODE->doc, anxpath, NULL); + return execute_xpath(self, anxpath, NULL); } - (NSArray*) objectsForXQuery: (NSString*)xquery