* 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
This commit is contained in:
Gregory John Casamento 2012-01-16 18:31:17 +00:00
parent 6a39289591
commit daf08b99a4
3 changed files with 89 additions and 44 deletions

View file

@ -1,3 +1,8 @@
2012-01-16 13:30-EST Gregory John Casamento <greg.casamento@gmail.com>
* Source/NSXMLElement.m
* Source/NSXMLNode.m: Corrections to make "basic" tests pass.
2012-01-15 10:48-EST Gregory John Casamento <greg.casamento@gmail.com> 2012-01-15 10:48-EST Gregory John Casamento <greg.casamento@gmail.com>
* Source/NSXMLNode.m * Source/NSXMLNode.m

View file

@ -44,6 +44,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
- (void) dealloc - (void) dealloc
{ {
/*
if (GS_EXISTS_INTERNAL && _internal != nil) if (GS_EXISTS_INTERNAL && _internal != nil)
{ {
while ([self childCount] > 0) while ([self childCount] > 0)
@ -51,6 +52,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
[self removeChildAtIndex: [self childCount] - 1]; [self removeChildAtIndex: [self childCount] - 1];
} }
} }
*/
[super dealloc]; [super dealloc];
} }
@ -76,6 +78,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
internal->node = (void *)xmlNewNode(NULL,(xmlChar *)[name UTF8String]); internal->node = (void *)xmlNewNode(NULL,(xmlChar *)[name UTF8String]);
((xmlNodePtr)internal->node)->_private = self; ((xmlNodePtr)internal->node)->_private = self;
internal->objectValue = @""; internal->objectValue = @"";
// return self;
} }
return [super initWithKind: kind options: theOptions]; return [super initWithKind: kind options: theOptions];
} }
@ -209,6 +212,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
[self notImplemented: _cmd]; [self notImplemented: _cmd];
} }
/*
- (void) setObjectValue: (id)value - (void) setObjectValue: (id)value
{ {
if (nil == value) if (nil == value)
@ -217,6 +221,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
} }
ASSIGN(internal->objectValue, value); ASSIGN(internal->objectValue, value);
} }
*/
- (NSArray*) namespaces - (NSArray*) namespaces
{ {

View file

@ -99,6 +99,7 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
return result; return result;
} }
/*
+ (xmlNodePtr) _nodeForObject: (NSXMLNode *)object + (xmlNodePtr) _nodeForObject: (NSXMLNode *)object
{ {
xmlNodePtr node = NULL; xmlNodePtr node = NULL;
@ -115,10 +116,14 @@ GS_PRIVATE_INTERNAL(NSXMLNode)
case(NSXMLElementKind): case(NSXMLElementKind):
node = xmlNewNode(NULL,XMLSTRING([object name])); node = xmlNewNode(NULL,XMLSTRING([object name]));
break; break;
case(NSXMLInvalidKind):
node = xmlNewNode(NULL,XMLSTRING([object name]));
break;
} }
} }
return node; return node;
} }
*/
- (void) _addSubNode:(NSXMLNode *)subNode - (void) _addSubNode:(NSXMLNode *)subNode
{ {
@ -198,10 +203,11 @@ int register_namespaces(xmlXPathContextPtr xpathCtx,
return(0); return(0);
} }
NSArray *execute_xpath(xmlDocPtr doc, NSArray *execute_xpath(NSXMLNode *node,
NSString *xpath_exp, NSString *xpath_exp,
NSString *nmspaces) NSString *nmspaces)
{ {
xmlDocPtr doc = ((xmlNodePtr)[node _node])->doc;
NSMutableArray *result = [NSMutableArray arrayWithCapacity: 10]; NSMutableArray *result = [NSMutableArray arrayWithCapacity: 10];
xmlChar* xpathExpr = (xmlChar *)XMLSTRING(xpath_exp); xmlChar* xpathExpr = (xmlChar *)XMLSTRING(xpath_exp);
xmlChar* nsList = (xmlChar *)XMLSTRING(nmspaces); xmlChar* nsList = (xmlChar *)XMLSTRING(nmspaces);
@ -467,16 +473,23 @@ NSArray *execute_xpath(xmlDocPtr doc,
- (NSArray*) children - (NSArray*) children
{ {
NSMutableArray *childrenArray = [NSMutableArray array]; NSMutableArray *childrenArray = nil;
if(NSXMLInvalidKind == internal->kind)
{
return nil;
}
else
{
xmlNodePtr children = NULL; xmlNodePtr children = NULL;
xmlNodePtr node = (xmlNodePtr)(internal->node); xmlNodePtr node = (xmlNodePtr)(internal->node);
childrenArray = [NSMutableArray array];
for (children = node->children; children; children = children->next) for (children = node->children; children; children = children->next)
{ {
NSXMLNode *n = [NSXMLNode _objectForNode: children]; NSXMLNode *n = [NSXMLNode _objectForNode: children];
[childrenArray addObject: n]; [childrenArray addObject: n];
} }
}
return childrenArray; return childrenArray;
} }
@ -504,11 +517,11 @@ NSArray *execute_xpath(xmlDocPtr doc,
if (GS_EXISTS_INTERNAL) if (GS_EXISTS_INTERNAL)
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node); xmlNodePtr node = (xmlNodePtr)(internal->node);
[self detach];
node->_private = NULL;
[internal->URI release]; [internal->URI release];
[internal->objectValue release]; [internal->objectValue release];
[internal->subNodes release]; [internal->subNodes release];
[self detach];
xmlFree(node);
GS_DESTROY_INTERNAL(NSXMLNode); GS_DESTROY_INTERNAL(NSXMLNode);
} }
[super dealloc]; [super dealloc];
@ -517,17 +530,13 @@ NSArray *execute_xpath(xmlDocPtr doc,
- (void) detach - (void) detach
{ {
xmlNodePtr node = (xmlNodePtr)(internal->node); xmlNodePtr node = (xmlNodePtr)(internal->node);
if(node)
{
xmlNodePtr parentNode = node->parent; xmlNodePtr parentNode = node->parent;
NSXMLNode *parent = (parentNode ? parentNode->_private : nil); // get our parent object if it exists NSXMLNode *parent = (parentNode ? parentNode->_private : nil); // get our parent object if it exists
[parent _removeSubNode:self]; [parent _removeSubNode:self];
xmlUnlinkNode(node); xmlUnlinkNode(node);
/*
if (node->parent != nil)
{
[(NSXMLElement*)internal->parent removeChildAtIndex: internal->index];
internal->parent = nil;
} }
*/
} }
- (NSUInteger) hash - (NSUInteger) hash
@ -561,6 +570,7 @@ NSArray *execute_xpath(xmlDocPtr doc,
- (id) initWithKind: (NSXMLNodeKind)kind options: (NSUInteger)theOptions - (id) initWithKind: (NSXMLNodeKind)kind options: (NSUInteger)theOptions
{ {
Class theSubclass = [NSXMLNode class]; Class theSubclass = [NSXMLNode class];
void *node = NULL;
if (nil == (self = [super init])) if (nil == (self = [super init]))
{ {
@ -573,14 +583,18 @@ NSArray *execute_xpath(xmlDocPtr doc,
switch (kind) switch (kind)
{ {
case NSXMLDocumentKind: case NSXMLDocumentKind:
node = xmlNewDoc((xmlChar *)"1.0");
theSubclass = [NSXMLDocument class]; theSubclass = [NSXMLDocument class];
break; break;
case NSXMLInvalidKind:
case NSXMLElementKind: case NSXMLElementKind:
node = xmlNewNode(NULL,(xmlChar *)"");
theSubclass = [NSXMLElement class]; theSubclass = [NSXMLElement class];
break; break;
case NSXMLDTDKind: case NSXMLDTDKind:
node = xmlNewDtd(NULL, NULL, NULL,NULL);
theSubclass = [NSXMLDTD class]; theSubclass = [NSXMLDTD class];
break; break;
@ -608,7 +622,11 @@ NSArray *execute_xpath(xmlDocPtr doc,
/* Create holder for internal instance variables if needed. /* 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 /* If we are initializing for the correct class, we can actually perform
* initializations: * initializations:
@ -684,6 +702,10 @@ NSArray *execute_xpath(xmlDocPtr doc,
- (NSString*) name - (NSString*) name
{ {
if(NSXMLInvalidKind == internal->kind)
{
return nil;
}
return StringFromXMLStringPtr(MY_NODE->name); return StringFromXMLStringPtr(MY_NODE->name);
} }
@ -806,15 +828,28 @@ NSArray *execute_xpath(xmlDocPtr doc,
- (NSString*) stringValue - (NSString*) stringValue
{ {
xmlNodePtr node = MY_NODE; 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; node = node->children;
} }
return StringFromXMLStringPtr(node->content); */
result = StringFromXMLStringPtr(content);
return result;
} }
- (NSString*) URI - (NSString*) URI
{ {
if(NSXMLInvalidKind == internal->kind)
{
return nil;
}
return internal->URI; // FIXME ... fetch from libxml return internal->URI; // FIXME ... fetch from libxml
} }
@ -897,7 +932,7 @@ NSArray *execute_xpath(xmlDocPtr doc,
- (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error - (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error
{ {
*error = NULL; *error = NULL;
return execute_xpath(MY_NODE->doc, anxpath, NULL); return execute_xpath(self, anxpath, NULL);
} }
- (NSArray*) objectsForXQuery: (NSString*)xquery - (NSArray*) objectsForXQuery: (NSString*)xquery