* Source/NSXMLDocument.m: Implement DTD validation and

XSLT transformation methods.
	* Source/NSXMLElement.m: Implement elementsForName: and
	remove commented out code which is no longer
	relevant.



git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/branches/nsxml_using_libxml2@34749 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Gregory John Casamento 2012-02-14 18:08:44 +00:00
parent b3ef2985c1
commit 08a3b6f975
3 changed files with 101 additions and 48 deletions

View file

@ -1,3 +1,11 @@
2012-02-14 13:07-EST Gregory John Casamento <greg.casamento@gmail.com>
* Source/NSXMLDocument.m: Implement DTD validation and
XSLT transformation methods.
* Source/NSXMLElement.m: Implement elementsForName: and
remove commented out code which is no longer
relevant.
2012-02-08 02:20-EST Gregory John Casamento <greg.casamento@gmail.com>
* Source/NSXMLDocument.m: Return YES if the self and other

View file

@ -28,11 +28,19 @@
#define GSInternal NSXMLDocumentInternal
#import "NSXMLPrivate.h"
#import "GSInternal.h"
#import <libxslt/xslt.h>
#import <libxslt/xsltInternals.h>
#import <libxslt/transform.h>
#import <libxslt/xsltutils.h>
GS_PRIVATE_INTERNAL(NSXMLDocument)
//#import <Foundation/NSXMLParser.h>
#import <Foundation/NSError.h>
#if defined(HAVE_LIBXML)
extern void clearPrivatePointers(xmlNodePtr aNode);
// Private methods to manage libxml pointers...
@ -395,30 +403,70 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
arguments: (NSDictionary*)arguments
error: (NSError**)error
{
[self notImplemented: _cmd];
return nil;
xmlChar *data = (xmlChar *)[xslt bytes];
xmlChar **params = NULL;
xmlDocPtr stylesheetDoc = xmlReadDoc(data, NULL, NULL, XML_PARSE_NOERROR);
xsltStylesheetPtr stylesheet = xsltParseStylesheetDoc(stylesheetDoc);
xmlDocPtr resultDoc = NULL;
NSEnumerator *en = [arguments keyEnumerator];
NSString *key = nil;
NSUInteger index = 0;
// Iterate over the keys and put them into params...
if(arguments != nil)
{
int count = [[arguments allKeys] count];
*params = NSZoneCalloc([self zone],((count + 1) * 2),sizeof(xmlChar *));
while((key = [en nextObject]) != nil)
{
params[index] = (xmlChar *)XMLSTRING(key);
params[index+1] = (xmlChar *)XMLSTRING([arguments objectForKey: key]);
index+=2;
}
}
// Apply the stylesheet and get the result...
resultDoc = xsltApplyStylesheet(stylesheet,MY_DOC,(const char **)params);
// Cleanup...
xsltFreeStylesheet(stylesheet);
xmlFreeDoc(stylesheetDoc);
xsltCleanupGlobals();
xmlCleanupParser();
NSZoneFree([self zone], params);
return [NSXMLNode _objectForNode: (xmlNodePtr)resultDoc];
}
- (id) objectByApplyingXSLTString: (NSString*)xslt
arguments: (NSDictionary*)arguments
error: (NSError**)error
{
[self notImplemented: _cmd];
return nil;
NSData *data = [[NSData alloc] initWithBytes: [xslt UTF8String]
length: [xslt length]];
NSXMLDocument *result = [self objectByApplyingXSLT: data
arguments: arguments
error: error];
[data release];
return result;
}
- (id) objectByApplyingXSLTAtURL: (NSURL*)xsltURL
arguments: (NSDictionary*)argument
arguments: (NSDictionary*)arguments
error: (NSError**)error
{
[self notImplemented: _cmd];
return nil;
NSData *data = [NSData dataWithContentsOfURL: xsltURL];
NSXMLDocument *result = [self objectByApplyingXSLT: data
arguments: arguments
error: error];
return result;
}
- (BOOL) validateAndReturnError: (NSError**)error
{
[self notImplemented: _cmd];
return NO;
xmlValidCtxtPtr ctxt = xmlNewValidCtxt();
BOOL result = (BOOL)(xmlValidateDocument(ctxt, MY_DOC));
return result;
}
- (id) copyWithZone: (NSZone *)zone
@ -439,3 +487,5 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
return [[self rootElement] isEqual: [other rootElement]];
}
@end
#endif

View file

@ -29,6 +29,8 @@
#import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLElement)
#if defined(HAVE_LIBXML)
extern void clearPrivatePointers(xmlNodePtr aNode);
// Private methods to manage libxml pointers...
@ -111,16 +113,42 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
return nil;
}
- (id) initWithXMLString: (NSString*)string error: (NSError**)error
- (id) initWithXMLString: (NSString*)string
error: (NSError**)error
{
[self notImplemented: _cmd];
return nil;
NSXMLElement *result = nil;
if((self = [super init]) != 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];
}
return result;
}
- (NSArray*) elementsForName: (NSString*)name
{
[self notImplemented: _cmd];
return nil;
NSMutableArray *results = [NSMutableArray arrayWithCapacity: 10];
xmlNodePtr cur = NULL;
for (cur = MY_NODE->children; cur != NULL; cur = cur->next)
{
NSString *n = StringFromXMLStringPtr(cur->name);
if([n isEqualToString: name])
{
NSXMLNode *node = (NSXMLNode *)(cur->_private);
[results addObject: node];
}
}
return results;
}
- (NSArray*) elementsForLocalName: (NSString*)localName URI: (NSString*)URI
@ -420,41 +448,8 @@ extern void clearPrivatePointers(xmlNodePtr aNode);
clearPrivatePointers(newNode); // clear out all of the _private pointers in the entire tree
c = [c _initWithNode:newNode kind:internal->kind];
return c;
/*
NSXMLElement *c = (NSXMLElement*)[super copyWithZone: zone];
NSEnumerator *en;
id obj;
en = [[self namespaces] objectEnumerator];
while ((obj = [en nextObject]) != nil)
{
NSXMLNode *ns = [obj copyWithZone: zone];
[c addNamespace: ns];
[ns release];
}
en = [[self attributes] objectEnumerator];
while ((obj = [en nextObject]) != nil)
{
NSXMLNode *attr = [obj copyWithZone: zone];
[c addAttribute: attr];
[attr release];
}
en = [[self children] objectEnumerator];
while ((obj = [en nextObject]) != nil)
{
NSXMLNode *child = [obj copyWithZone: zone];
[c addChild: child];
[child release];
}
return c;
*/
}
@end
#endif