* Source/NSXMLNode.m (-_nodeFollowingInNaturalDirection:): Correct

this method.
* Source/NSXMLDocument.m,
* Source/NSXMLElement.m: Clean up children methods.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34807 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2012-02-22 22:52:31 +00:00
parent 30c7457ba0
commit dfb7d984d6
4 changed files with 97 additions and 117 deletions

View file

@ -1,3 +1,10 @@
2012-02-22 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSXMLNode.m (-_nodeFollowingInNaturalDirection:): Correct
this method.
* Source/NSXMLDocument.m,
* Source/NSXMLElement.m: Clean up children methods.
2012-02-22 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSXMLNode.m: Further clean up.

View file

@ -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;
}

View file

@ -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

View file

@ -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);