* Source/NSXMLNode.m (-detach): Don't handle the namespace case.

* Source/NSXMLElement.m (-removeNamespaceForPrefix:): Implement.
* Tests/base/NSXMLNode/basic.m: Move tests from here ...
* Tests/base/NSXMLElement/basic.m: ... to here.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34927 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2012-03-12 22:33:27 +00:00
parent 86330f01a7
commit 18c64eae4f
5 changed files with 96 additions and 51 deletions

View file

@ -1,3 +1,10 @@
2012-03-12 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSXMLNode.m (-detach): Don't handle the namespace case.
* Source/NSXMLElement.m (-removeNamespaceForPrefix:): Implement.
* Tests/base/NSXMLNode/basic.m: Move tests from here ...
* Tests/base/NSXMLElement/basic.m: ... to here.
2012-03-12 Fred Kiefer <FredKiefer@gmx.de> 2012-03-12 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSXMLElement.m: Correct used namespace field. * Source/NSXMLElement.m: Correct used namespace field.

View file

@ -294,11 +294,44 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
cur = cur->next; cur = cur->next;
} }
} }
[self _addSubNode: aNamespace];
} }
- (void) removeNamespaceForPrefix: (NSString*)name - (void) removeNamespaceForPrefix: (NSString*)name
{ {
[self notImplemented: _cmd]; if (internal->node->nsDef != NULL)
{
xmlNsPtr cur = internal->node->nsDef;
xmlNsPtr last = NULL;
const xmlChar *prefix = XMLSTRING(name);
while (cur != NULL)
{
if (xmlStrcmp(prefix, cur->prefix) == 0)
{
if (last == NULL)
{
internal->node->nsDef = cur->next;
}
else
{
last->next = cur->next;
}
cur->next = NULL;
if (cur->_private != NULL)
{
[self _removeSubNode: (NSXMLNode *)cur->_private];
}
else
{
xmlFreeNode(cur);
}
return;
}
last = cur;
cur = cur->next;
}
}
} }
- (void) setNamespaces: (NSArray*)namespaces - (void) setNamespaces: (NSArray*)namespaces
@ -312,17 +345,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
// internal->node->nsDef = NULL; // internal->node->nsDef = NULL;
while ((namespace = (NSXMLNode *)[en nextObject]) != nil) while ((namespace = (NSXMLNode *)[en nextObject]) != nil)
{ {
xmlNsPtr ns = (xmlNsPtr)[namespace _node]; [self addNamespace: namespace];
if (internal->node->nsDef == NULL)
{
internal->node->nsDef = ns;
cur = ns;
}
else
{
cur->next = ns;
cur = ns;
}
} }
} }

View file

@ -1052,9 +1052,17 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
{ {
NSXMLNode *parent = [self parent]; NSXMLNode *parent = [self parent];
if (node->type == XML_NAMESPACE_DECL)
{
// FIXME
}
else
{
// separate our node from its parent and siblings // separate our node from its parent and siblings
xmlUnlinkNode(node); xmlUnlinkNode(node);
xmlSetTreeDoc(node, NULL); xmlSetTreeDoc(node, NULL);
}
if (parent) if (parent)
{ {
[parent _removeSubNode: self]; [parent _removeSubNode: self];

View file

@ -7,10 +7,18 @@ int main()
NSAutoreleasePool *arp = [NSAutoreleasePool new]; NSAutoreleasePool *arp = [NSAutoreleasePool new];
NSXMLElement *node; NSXMLElement *node;
NSXMLElement *other; NSXMLElement *other;
NSXMLElement *xml;
NSXMLNode *attr;
NSArray *instances;
node = [[NSXMLElement alloc] initWithName: @"node"]; node = [[NSXMLElement alloc] initWithName: @"node"];
xml = [[NSXMLElement alloc] initWithXMLString: @"<element attr=\"value\"></element>"
error: NULL];
other = [NSXMLNode elementWithName: @"other" children: nil attributes: nil];
instances = [NSArray arrayWithObjects: node, other, xml, nil];
test_alloc(@"NSXMLElement"); test_alloc(@"NSXMLElement");
test_NSObject(@"NSXMLElement", [NSArray arrayWithObject: node]); test_NSObject(@"NSXMLElement", instances);
test_NSCopying(@"NSXMLElement", @"NSXMLElement", instances, NO, YES);
other = [[NSXMLElement alloc] initWithName: @"other"]; other = [[NSXMLElement alloc] initWithName: @"other"];
PASS(NO == [other isEqual: node], "differently named elements are not equal"); PASS(NO == [other isEqual: node], "differently named elements are not equal");
@ -21,7 +29,7 @@ int main()
[other release]; [other release];
PASS(NSXMLElementKind == [node kind], "invalid node kind is correct"); PASS(NSXMLElementKind == [node kind], "element node kind is correct");
PASS(0 == [node level], "element node level is zero"); PASS(0 == [node level], "element node level is zero");
PASS_EQUAL([node URI], nil, "element node URI is nil"); PASS_EQUAL([node URI], nil, "element node URI is nil");
PASS_EQUAL([node objectValue], @"", "element node object value is empty"); PASS_EQUAL([node objectValue], @"", "element node object value is empty");
@ -46,6 +54,37 @@ int main()
[node release]; [node release];
// Equality tests.
node = [[NSXMLNode alloc] initWithKind: NSXMLElementKind];
other = [[NSXMLNode alloc] initWithKind: NSXMLElementKind];
[other setName: @"test"];
[node setName: @"test"];
PASS([node isEqual: other],
"Elements with the same name are equal");
attr = [NSXMLNode attributeWithName: @"key"
stringValue: @"value"];
[node addAttribute:attr];
PASS(![node isEqual: other],
"Elements with different attributes are NOT equal");
attr = [NSXMLNode attributeWithName: @"key"
stringValue: @"value"];
[other addAttribute:attr];
PASS([node isEqual: other],
"Elements with the same attributes are equal");
[other setStringValue: @"value"];
PASS(![node isEqual: other],
"Elements with different values are NOT equal");
[node setStringValue: @"value"];
PASS([node isEqual: other],
"Elements with same values are equal");
[node release];
[other release];
[arp release]; [arp release];
arp = nil; arp = nil;

View file

@ -103,6 +103,7 @@ int main()
PASS_EQUAL([attr stringValue], @"value", "string value on attr node works"); PASS_EQUAL([attr stringValue], @"value", "string value on attr node works");
// In libxml2 the value is on a child node // In libxml2 the value is on a child node
//PASS_EQUAL([attr children], nil, "attr node children is nil"); //PASS_EQUAL([attr children], nil, "attr node children is nil");
//PASS([attr childCount] == 0, "No child on attr node");
[attr setName: @"name"]; [attr setName: @"name"];
PASS_EQUAL([attr name], @"name", PASS_EQUAL([attr name], @"name",
@ -110,39 +111,6 @@ int main()
[attr setStringValue: @"aString"]; [attr setStringValue: @"aString"];
PASS_EQUAL([attr stringValue], @"aString", PASS_EQUAL([attr stringValue], @"aString",
"setting string value on attr node works"); "setting string value on attr node works");
// In libxml2 the value is on a child node
//PASS([attr childCount] == 0, "No child on attr node");
// Equality tests.
node = [[NSXMLNode alloc] initWithKind: NSXMLElementKind];
other = [[NSXMLNode alloc] initWithKind: NSXMLElementKind];
[other setName: @"test"];
[node setName: @"test"];
PASS([node isEqual: other],
"Nodes with the same name are equal");
attr = [NSXMLNode attributeWithName: @"key"
stringValue: @"value"];
[node addAttribute:attr];
PASS(![node isEqual: other],
"Nodes with different attributes are NOT equal");
attr = [NSXMLNode attributeWithName: @"key"
stringValue: @"value"];
[other addAttribute:attr];
PASS([node isEqual: other],
"Nodes with the same attributes are equal");
[other setStringValue: @"value"];
PASS(![node isEqual: other],
"Nodes with different values are NOT equal");
[node setStringValue: @"value"];
PASS([node isEqual: other],
"Nodes with different values are equal");
[node release];
[other release];
[arp release]; [arp release];
arp = nil; arp = nil;