Skip to content

Commit

Permalink
Merge pull request #405 from gnustep/small_xml_fixes
Browse files Browse the repository at this point in the history
Two small xml fixes
  • Loading branch information
sensetalkdoug authored May 15, 2024
2 parents 94a6cb9 + fdffcbd commit 0935f77
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 3 deletions.
10 changes: 10 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2024-04-29 Doug Simons <[email protected]>

* NSXMLNode.m:
Fix execute_xpath() to return an NSError when xpath expression can't
be evaluated instead of just calling NSLog.

* NSXMLElement.m:
Fix setAttributes: and setAttributesWithDictionary: to remove previous
attributes.

2024-05-12 ethanc8R (github user)

* Headers/Foundation/NSRegularExpression.h:
Expand Down
22 changes: 20 additions & 2 deletions Source/NSXMLElement.m
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,16 @@ - (void) setAttributes: (NSArray*)attributes
NSEnumerator *enumerator = [attributes objectEnumerator];
NSXMLNode *attribute;

// FIXME: Remove all previous attributes
// Remove all previous attributes
NSArray *currentAttributes = [self attributes];
int index;
for (index = [currentAttributes count]-1; index >= 0; index--)
{
NSXMLNode *attrNode = [currentAttributes objectAtIndex:index];
NSString *name = [attrNode name];
[self removeAttributeForName:name];
}

while ((attribute = [enumerator nextObject]) != nil)
{
[self addAttribute: attribute];
Expand All @@ -379,7 +388,16 @@ - (void) setAttributesWithDictionary: (NSDictionary*)attributes
NSEnumerator *en = [attributes keyEnumerator];
NSString *key;

// FIXME: Remove all previous attributes
// Remove all previous attributes
NSArray *currentAttributes = [self attributes];
int index;
for (index = [currentAttributes count]-1; index >= 0; index--)
{
NSXMLNode *attrNode = [currentAttributes objectAtIndex:index];
NSString *name = [attrNode name];
[self removeAttributeForName:name];
}

while ((key = [en nextObject]) != nil)
{
NSString *val = [[attributes objectForKey: key] stringValue];
Expand Down
9 changes: 9 additions & 0 deletions Source/NSXMLNode.m
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#define GSInternal NSXMLNodeInternal

#import "Foundation/NSCharacterSet.h"
#import "Foundation/NSError.h"
#import "NSXMLPrivate.h"
#import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLNode)
Expand Down Expand Up @@ -826,6 +827,14 @@ - (void) _invalidate
if (xpathObj == NULL)
{
NSLog(@"Error: unable to evaluate xpath expression \"%s\"", xpathExpr);
if (error != 0)
{
xmlError xmlError = xpathCtx->lastError;
NSString *message = [NSString stringWithFormat:@"Error: unable to evaluate xpath expression \"%s\" (%d)", xpathExpr, xmlError.code];
*error = [NSError errorWithDomain: @"LibXMLErrorDomain"
code: xmlError.code
userInfo: [NSDictionary dictionaryWithObject:message forKey:NSLocalizedDescriptionKey]];
}
xmlXPathFreeContext(xpathCtx);
return nil;
}
Expand Down
10 changes: 9 additions & 1 deletion Tests/base/NSXMLElement/attributes.m
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,15 @@ int main()
NSInternalInconsistencyException,
"cannot add attributes to multiple parents");


[root1 setAttributes:@[attr2]];
PASS_EQUAL([root1 attributeForName: @"attr2"], attr2,
"setAttributes: added the new attribute");
PASS_EQUAL([root1 attributeForName: @"attr1"], nil,
"setAttributes: removed the old attribute");
PASS_EQUAL([root1 attributes], @[attr2], "attributes are just as set");
[root1 setAttributes:@[]];
PASS_EQUAL([root1 attributes], @[], "setAttributes:@[] removes all attributes");


[root1 release];
[root2 release];
Expand Down
35 changes: 35 additions & 0 deletions Tests/base/NSXMLNode/xpath.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#import "ObjectTesting.h"
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSXMLElement.h>
#import <Foundation/NSXMLDocument.h>
#import <Foundation/NSXMLNode.h>
#import <Foundation/NSError.h>

int main()
{
NSAutoreleasePool *arp = [NSAutoreleasePool new];

NSString *sourceXML = @"<parent>"
"<chyld>buzz</chyld>"
"<otherchyld>woody</otherchyld>"
"<zorgtree>gollyfoo</zorgtree>"
"<ln:loner xmlns:ln=\"http://loner.ns\">POW</ln:loner>"
"</parent>";
NSXMLDocument *doc = [[[NSXMLDocument alloc] initWithXMLString:sourceXML options:0 error:NULL] autorelease];
PASS(doc != nil, "created a document from an XML string");

NSError *anError = nil;
NSXMLNode *node = [[doc nodesForXPath:@"//chyld" error:&anError] lastObject];
PASS(node != nil, "access chyld node");
PASS(anError == nil, "no error accessing chyld node");
PASS_EQUAL([node stringValue], @"buzz", "retrieve chyld node");

node = [[doc nodesForXPath:@"//ln:loner" error:&anError] lastObject];
PASS(node == nil, "can't access ln:loner node if namespace not defined at top");
PASS(anError != nil, "should get error when fail to access node");

[arp release];
arp = nil;

return 0;
}

0 comments on commit 0935f77

Please sign in to comment.