mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
* 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:
parent
30c7457ba0
commit
dfb7d984d6
4 changed files with 97 additions and 117 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue