mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 00:41:02 +00:00
* 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:
parent
b3ef2985c1
commit
08a3b6f975
3 changed files with 101 additions and 48 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue