Fix execute_xpath() to return an NSError when expression can't be evaluated; Remove previous attributes when setting attributes; Add related tests

This commit is contained in:
Doug Simons 2024-05-14 15:25:07 -06:00 committed by GitHub
parent 3f994d3ee1
commit 50f447f5b8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 81 additions and 3 deletions

View file

@ -362,7 +362,15 @@ extern void ensure_oldNs(xmlNodePtr node);
NSEnumerator *enumerator = [attributes objectEnumerator];
NSXMLNode *attribute;
// FIXME: Remove all previous attributes
// Remove all previous attributes
NSArray *currentAttributes = [self attributes];
for (int 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];
@ -379,7 +387,15 @@ extern void ensure_oldNs(xmlNodePtr node);
NSEnumerator *en = [attributes keyEnumerator];
NSString *key;
// FIXME: Remove all previous attributes
// Remove all previous attributes
NSArray *currentAttributes = [self attributes];
for (int 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];

View file

@ -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)
@ -826,6 +827,14 @@ execute_xpath(xmlNodePtr node, NSString *xpath_exp, NSDictionary *constants,
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: @{NSLocalizedDescriptionKey:message}];
}
xmlXPathFreeContext(xpathCtx);
return nil;
}