* Source/NSXMLNode.m (+_objectForNode:): Get the actual class from

the document.
* Source/NSXMLNode.m (-description): Add a simple description method.
* Source/NSXMLDocument.m: Further cleanup. Exchange the contents
of -initWithData:... and initWithXMLString:...


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34826 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
fredkiefer 2012-02-27 12:53:25 +00:00
parent a1c047b38f
commit 4b79143129
3 changed files with 111 additions and 75 deletions

View file

@ -1,3 +1,11 @@
2012-02-27 Fred Kiefer <FredKiefer@gmx.de>
* Source/NSXMLNode.m (+_objectForNode:): Get the actual class from
the document.
* Source/NSXMLNode.m (-description): Add a simple description method.
* Source/NSXMLDocument.m: Further cleanup. Exchange the contents of
-initWithData:... and initWithXMLString:...
2012-02-27 Richard Frith-Macdonald <rfm@gnu.org> 2012-02-27 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSArchiver.m: * Source/NSArchiver.m:

View file

@ -59,7 +59,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
+ (Class) replacementClassForClass: (Class)cls + (Class) replacementClassForClass: (Class)cls
{ {
return Nil; return cls;
} }
- (void) dealloc - (void) dealloc
@ -118,16 +118,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
options: (NSUInteger)mask options: (NSUInteger)mask
error: (NSError**)error error: (NSError**)error
{ {
NSString *string = nil;
// Check for nil data and throw an exception // Check for nil data and throw an exception
if (![data isKindOfClass: [NSData class]])
{
DESTROY(self);
[NSException raise: NSInvalidArgumentException
format: @"[NSXMLDocument-%@] non data argument",
NSStringFromSelector(_cmd)];
}
if (nil == data) if (nil == data)
{ {
DESTROY(self); DESTROY(self);
@ -135,12 +126,41 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
format: @"[NSXMLDocument-%@] nil argument", format: @"[NSXMLDocument-%@] nil argument",
NSStringFromSelector(_cmd)]; NSStringFromSelector(_cmd)];
} }
if (![data isKindOfClass: [NSData class]])
{
DESTROY(self);
[NSException raise: NSInvalidArgumentException
format: @"[NSXMLDocument-%@] non data argument",
NSStringFromSelector(_cmd)];
}
// Initialize the string... if ((self = [self initWithKind: NSXMLDocumentKind options: 0]) != nil)
string = [[NSString alloc] initWithData: data {
encoding: NSUTF8StringEncoding]; char *url = NULL;
AUTORELEASE(string); char *encoding = NULL; // "UTF8";
return [self initWithXMLString:string options:mask error:error]; int options = XML_PARSE_NOERROR;
xmlDocPtr doc = NULL;
if (!(mask & NSXMLNodePreserveWhitespace))
{
options |= XML_PARSE_NOBLANKS;
//xmlKeepBlanksDefault(0);
}
doc = xmlReadMemory([data bytes], [data length],
url, encoding, options);
if (doc == NULL)
{
DESTROY(self);
if (error != NULL)
{
*error = [NSError errorWithDomain: @"NSXMLErrorDomain"
code: 0
userInfo: nil];
}
}
[self _setNode: doc];
}
return self;
} }
- (id) initWithKind: (NSXMLNodeKind)kind options: (NSUInteger)theOptions - (id) initWithKind: (NSXMLNodeKind)kind options: (NSUInteger)theOptions
@ -159,13 +179,6 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
- (id) initWithRootElement: (NSXMLElement*)element - (id) initWithRootElement: (NSXMLElement*)element
{ {
if ([element parent] != nil)
{
[NSException raise: NSInternalInconsistencyException
format: @"%@ cannot be used as root of %@",
element,
self];
}
self = [self initWithKind: NSXMLDocumentKind options: 0]; self = [self initWithKind: NSXMLDocumentKind options: 0];
if (self != nil) if (self != nil)
{ {
@ -178,42 +191,23 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
options: (NSUInteger)mask options: (NSUInteger)mask
error: (NSError**)error error: (NSError**)error
{ {
if (nil == string)
{
DESTROY(self);
[NSException raise: NSInvalidArgumentException
format: @"[NSXMLDocument-%@] nil argument",
NSStringFromSelector(_cmd)];
}
if (NO == [string isKindOfClass: [NSString class]]) if (NO == [string isKindOfClass: [NSString class]])
{ {
DESTROY(self); DESTROY(self);
if (nil == string)
{
[NSException raise: NSInvalidArgumentException
format: @"[NSXMLDocument-%@] nil argument",
NSStringFromSelector(_cmd)];
}
[NSException raise: NSInvalidArgumentException [NSException raise: NSInvalidArgumentException
format: @"[NSXMLDocument-%@] invalid argument", format: @"[NSXMLDocument-%@] invalid argument",
NSStringFromSelector(_cmd)]; NSStringFromSelector(_cmd)];
} }
if ((self = [self initWithKind: NSXMLDocumentKind options: 0]) != nil) return [self initWithData: [string dataUsingEncoding: NSUTF8StringEncoding]
{ options: mask
const char *str = [string UTF8String]; error: error];
char *url = NULL;
char *encoding = NULL; // "UTF8";
int options = XML_PARSE_NOERROR;
xmlDocPtr doc = NULL;
if (!(mask & NSXMLNodePreserveWhitespace))
options |= XML_PARSE_NOBLANKS;
//xmlKeepBlanksDefault(0);
doc = xmlReadDoc((xmlChar *)str, url, encoding, options);
if (doc == NULL)
{
[self release];
self = nil;
if (error != NULL)
*error = [NSError errorWithDomain:@"NSXMLErrorDomain" code:0 userInfo:nil];
//[NSException raise:NSInvalidArgumentException
// format:@"Cannot instantiate NSXMLDocument with invalid data"];
}
[self _setNode:doc];
}
return self;
} }
- (BOOL) isStandalone - (BOOL) isStandalone
@ -229,7 +223,7 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
- (NSXMLElement*) rootElement - (NSXMLElement*) rootElement
{ {
xmlNodePtr rootElem = xmlDocGetRootElement(MY_DOC); xmlNodePtr rootElem = xmlDocGetRootElement(MY_DOC);
return (NSXMLElement *)[NSXMLNode _objectForNode:rootElem]; return (NSXMLElement *)[NSXMLNode _objectForNode: rootElem];
} }
- (void) setCharacterEncoding: (NSString*)encoding - (void) setCharacterEncoding: (NSString*)encoding
@ -262,12 +256,19 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
{ {
return; return;
} }
if ([root parent] != nil)
{
[NSException raise: NSInternalInconsistencyException
format: @"%@ cannot be used as root of %@",
root,
self];
}
xmlDocSetRootElement(MY_DOC,[root _node]); xmlDocSetRootElement(MY_DOC, [root _node]);
// Do our subNode housekeeping... // Do our subNode housekeeping...
[self _removeSubNode:oldElement]; [self _removeSubNode: oldElement];
[self _addSubNode:root]; [self _addSubNode: root];
} }
- (void) setStandalone: (BOOL)standalone - (void) setStandalone: (BOOL)standalone
@ -400,30 +401,31 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
error: (NSError**)error error: (NSError**)error
{ {
#ifdef HAVE_LIBXSLT #ifdef HAVE_LIBXSLT
xmlChar *data = (xmlChar *)[xslt bytes];
xmlChar **params = NULL; xmlChar **params = NULL;
xmlDocPtr stylesheetDoc = xmlReadDoc(data, NULL, NULL, XML_PARSE_NOERROR); xmlDocPtr stylesheetDoc = xmlReadMemory([xslt bytes], [xslt length],
NULL, NULL, XML_PARSE_NOERROR);
xsltStylesheetPtr stylesheet = xsltParseStylesheetDoc(stylesheetDoc); xsltStylesheetPtr stylesheet = xsltParseStylesheetDoc(stylesheetDoc);
xmlDocPtr resultDoc = NULL; xmlDocPtr resultDoc = NULL;
NSEnumerator *en = [arguments keyEnumerator];
NSString *key = nil;
NSUInteger index = 0;
// Iterate over the keys and put them into params... // Iterate over the keys and put them into params...
if (arguments != nil) if (arguments != nil)
{ {
NSEnumerator *en = [arguments keyEnumerator];
NSString *key = nil;
NSUInteger index = 0;
int count = [[arguments allKeys] count]; int count = [[arguments allKeys] count];
*params = NSZoneCalloc([self zone],((count + 1) * 2),sizeof(xmlChar *));
*params = NSZoneCalloc([self zone], ((count + 1) * 2), sizeof(xmlChar *));
while ((key = [en nextObject]) != nil) while ((key = [en nextObject]) != nil)
{ {
params[index] = (xmlChar *)XMLSTRING(key); params[index] = (xmlChar *)XMLSTRING(key);
params[index+1] = (xmlChar *)XMLSTRING([arguments objectForKey: key]); params[index+1] = (xmlChar *)XMLSTRING([arguments objectForKey: key]);
index+=2; index += 2;
} }
} }
// Apply the stylesheet and get the result... // Apply the stylesheet and get the result...
resultDoc = xsltApplyStylesheet(stylesheet,MY_DOC,(const char **)params); resultDoc = xsltApplyStylesheet(stylesheet, MY_DOC, (const char **)params);
// Cleanup... // Cleanup...
xsltFreeStylesheet(stylesheet); xsltFreeStylesheet(stylesheet);
@ -442,12 +444,10 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
arguments: (NSDictionary*)arguments arguments: (NSDictionary*)arguments
error: (NSError**)error error: (NSError**)error
{ {
NSData *data = [[NSData alloc] initWithBytes: [xslt UTF8String] NSData *data = [xslt dataUsingEncoding: NSUTF8StringEncoding];
length: [xslt length]];
NSXMLDocument *result = [self objectByApplyingXSLT: data NSXMLDocument *result = [self objectByApplyingXSLT: data
arguments: arguments arguments: arguments
error: error]; error: error];
[data release];
return result; return result;
} }

View file

@ -233,32 +233,53 @@ BOOL isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB)
result = node->_private; result = node->_private;
if (result == nil) if (result == nil)
{ {
Class cls;
NSXMLNodeKind kind;
xmlElementType type = node->type; xmlElementType type = node->type;
switch(type) switch (type)
{ {
case XML_DOCUMENT_NODE: case XML_DOCUMENT_NODE:
result = [[NSXMLDocument alloc] _initWithNode: node kind: NSXMLDocumentKind]; cls = [NSXMLDocument class];
kind = NSXMLDocumentKind;
break; break;
case XML_ELEMENT_NODE: case XML_ELEMENT_NODE:
result = [[NSXMLElement alloc] _initWithNode: node kind: NSXMLElementKind]; cls = [NSXMLElement class];
kind = NSXMLElementKind;
break; break;
case XML_TEXT_NODE: case XML_TEXT_NODE:
result = [[self alloc] _initWithNode: node kind: NSXMLTextKind]; cls = [NSXMLNode class];
kind = NSXMLTextKind;
break; break;
case XML_PI_NODE: case XML_PI_NODE:
result = [[self alloc] _initWithNode: node kind: NSXMLProcessingInstructionKind]; cls = [NSXMLNode class];
kind = NSXMLProcessingInstructionKind;
break; break;
case XML_COMMENT_NODE: case XML_COMMENT_NODE:
result = [[self alloc] _initWithNode: node kind: NSXMLCommentKind]; cls = [NSXMLNode class];
kind = NSXMLCommentKind;
break; break;
case XML_ATTRIBUTE_NODE: case XML_ATTRIBUTE_NODE:
result = [[self alloc] _initWithNode: node kind: NSXMLAttributeKind]; cls = [NSXMLNode class];
kind = NSXMLAttributeKind;
break; break;
default: default:
NSLog(@"ERROR: _objectForNode: called with a node of type %d", type); NSLog(@"ERROR: _objectForNode: called with a node of type %d", type);
return nil;
break; break;
} }
if ((node->doc != NULL) && ((xmlNodePtr)(node->doc) != node))
{
NSXMLDocument *doc;
doc = (NSXMLDocument*)[self _objectForNode: (xmlNodePtr)node->doc];
if (doc != nil)
{
cls = [[doc class] replacementClassForClass: cls];
}
}
result = [[cls alloc] _initWithNode: node kind: kind];
AUTORELEASE(result); AUTORELEASE(result);
if (node->parent) if (node->parent)
{ {
@ -933,6 +954,13 @@ NSArray *execute_xpath(NSXMLNode *xmlNode,
return c; return c;
} }
- (NSString*) description
{
return [NSString stringWithFormat:@"<%@ %@ %d>%@\n",
NSStringFromClass([self class]),
[self name], [self kind], [self stringValue]];
}
- (id) retain - (id) retain
{ {
[super retain]; // do this first [super retain]; // do this first