restructure a bit to make it easier to add namespace support.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34924 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2012-03-12 13:27:32 +00:00
parent 5d7276fd43
commit 41d2f1f1bf
9 changed files with 385 additions and 106 deletions

View file

@ -1,3 +1,16 @@
2012-03-11 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSXMLNamespace.m: New class for namespaces
* Source/GNUmakefile: Build with new class
* Source/NSXMLDocument.m:
* Source/NSXMLPrivate.h:
* Source/NSXMLDTD.m:
* Source/NSXMLNode.m:
* Source/NSXMLDTDNode.m:
* Source/NSXMLElement.m:
Use a new class for namespaces ... just a placeholder/skeleton so far.
Change other classes to know the correct type of their 'node' pointer.
2012-03-11 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSXMLNode.m: Avoid crash when trying to get the parent of a

View file

@ -286,6 +286,7 @@ NSXMLDocument.m \
NSXMLDTD.m \
NSXMLDTDNode.m \
NSXMLElement.m \
NSXMLNamespace.m \
NSXMLNode.m \
NSXMLParser.m \
NSZone.m \

View file

@ -24,7 +24,9 @@
#import "common.h"
#define GSInternal NSXMLDTDInternal
#define GS_XMLNODETYPE xmlDtd
#define GSInternal NSXMLDTDInternal
#import "NSXMLPrivate.h"
#import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLDTD)
@ -147,7 +149,7 @@ GS_PRIVATE_INTERNAL(NSXMLDTD)
- (NSString*) publicID
{
xmlDtd *node = MY_DTD;
xmlDtd *node = internal->node;
return StringFromXMLStringPtr(node->ExternalID);
}
@ -169,21 +171,21 @@ GS_PRIVATE_INTERNAL(NSXMLDTD)
- (void) setPublicID: (NSString*)publicID
{
xmlDtd *node = MY_DTD;
xmlDtd *node = internal->node;
node->ExternalID = XMLStringCopy(publicID);
}
- (void) setSystemID: (NSString*)systemID
{
xmlDtd *node = MY_DTD;
xmlDtd *node = internal->node;
node->SystemID = XMLStringCopy(systemID);
}
- (NSString*) systemID
{
xmlDtd *node = MY_DTD;
xmlDtd *node = internal->node;
return StringFromXMLStringPtr(node->SystemID);
}

View file

@ -24,7 +24,9 @@
#import "common.h"
#define GSInternal NSXMLDTDNodeInternal
#define GS_XMLNODETYPE xmlDtd
#define GSInternal NSXMLDTDNodeInternal
#import "NSXMLPrivate.h"
#import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLDTDNode)
@ -85,12 +87,12 @@ GS_PRIVATE_INTERNAL(NSXMLDTDNode)
- (NSString*) notationName
{
return StringFromXMLStringPtr(MY_DTD->name);
return StringFromXMLStringPtr(internal->node->name);
}
- (NSString*) publicID
{
return StringFromXMLStringPtr(MY_DTD->ExternalID);
return StringFromXMLStringPtr(internal->node->ExternalID);
}
- (void) setDTDKind: (NSXMLDTDNodeKind)kind
@ -100,22 +102,22 @@ GS_PRIVATE_INTERNAL(NSXMLDTDNode)
- (void) setNotationName: (NSString*)notationName
{
MY_DTD->name = XMLSTRING(notationName);
internal->node->name = XMLSTRING(notationName);
}
- (void) setPublicID: (NSString*)publicID
{
MY_DTD->ExternalID = XMLSTRING(publicID);
internal->node->ExternalID = XMLSTRING(publicID);
}
- (void) setSystemID: (NSString*)systemID
{
MY_DTD->ExternalID = XMLSTRING(systemID);
internal->node->ExternalID = XMLSTRING(systemID);
}
- (NSString*) systemID
{
return StringFromXMLStringPtr(MY_DTD->SystemID);
return StringFromXMLStringPtr(internal->node->SystemID);
}
@end

View file

@ -25,7 +25,9 @@
#import "common.h"
#define GSInternal NSXMLDocumentInternal
#define GS_XMLNODETYPE xmlDoc
#define GSInternal NSXMLDocumentInternal
#import "NSXMLPrivate.h"
#import "GSInternal.h"
@ -55,8 +57,8 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
- (NSString*) characterEncoding
{
if (MY_DOC->encoding)
return StringFromXMLStringPtr(MY_DOC->encoding);
if (internal->node->encoding)
return StringFromXMLStringPtr(internal->node->encoding);
else
return nil;
}
@ -193,7 +195,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
- (BOOL) isStandalone
{
return (MY_DOC->standalone == 1);
return (internal->node->standalone == 1);
}
- (NSString*) MIMEType
@ -203,13 +205,13 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
- (NSXMLElement*) rootElement
{
xmlNodePtr rootElem = xmlDocGetRootElement(MY_DOC);
xmlNodePtr rootElem = xmlDocGetRootElement(internal->node);
return (NSXMLElement *)[NSXMLNode _objectForNode: rootElem];
}
- (void) setCharacterEncoding: (NSString*)encoding
{
MY_DOC->encoding = XMLStringCopy(encoding);
internal->node->encoding = XMLStringCopy(encoding);
}
- (void) setDocumentContentKind: (NSXMLDocumentContentKind)kind
@ -221,7 +223,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
{
NSAssert(documentTypeDeclaration != nil, NSInvalidArgumentException);
ASSIGNCOPY(internal->docType, documentTypeDeclaration);
MY_DOC->extSubset = [documentTypeDeclaration _node];
internal->node->extSubset = [documentTypeDeclaration _node];
}
- (void) setMIMEType: (NSString*)MIMEType
@ -247,7 +249,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
// FIXME: Should remove all sub nodes
xmlDocSetRootElement(MY_DOC, [root _node]);
xmlDocSetRootElement(internal->node, [root _node]);
// Do our subNode housekeeping...
[self _removeSubNode: oldElement];
@ -256,14 +258,14 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
- (void) setStandalone: (BOOL)standalone
{
MY_DOC->standalone = standalone;
internal->node->standalone = standalone;
}
- (void) setVersion: (NSString*)version
{
if ([version isEqualToString: @"1.0"] || [version isEqualToString: @"1.1"])
{
MY_DOC->version = XMLStringCopy(version);
internal->node->version = XMLStringCopy(version);
}
else
{
@ -274,8 +276,8 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
- (NSString*) version
{
if (MY_DOC->version)
return StringFromXMLStringPtr(MY_DOC->version);
if (internal->node->version)
return StringFromXMLStringPtr(internal->node->version);
else
return @"1.0";
}
@ -369,7 +371,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
xmlChar *buf = NULL;
int length;
xmlDocDumpFormatMemoryEnc(MY_DOC, &buf, &length, "utf-8",
xmlDocDumpFormatMemoryEnc(internal->node, &buf, &length, "utf-8",
((options & NSXMLNodePrettyPrint) ? 1 : 0));
if (buf != 0 && length > 0)
@ -409,7 +411,8 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
}
// Apply the stylesheet and get the result...
resultDoc = xsltApplyStylesheet(stylesheet, MY_DOC, (const char **)params);
resultDoc
= xsltApplyStylesheet(stylesheet, internal->node, (const char **)params);
// Cleanup...
xsltFreeStylesheet(stylesheet);
@ -451,7 +454,7 @@ GS_PRIVATE_INTERNAL(NSXMLDocument)
xmlValidCtxtPtr ctxt = xmlNewValidCtxt();
// FIXME: Should use xmlValidityErrorFunc and userData
// to get the error
BOOL result = (BOOL)(xmlValidateDocument(ctxt, MY_DOC));
BOOL result = (BOOL)(xmlValidateDocument(ctxt, internal->node));
xmlFreeValidCtxt(ctxt);
return result;
}

View file

@ -24,7 +24,9 @@
#import "common.h"
#define GSInternal NSXMLElementInternal
#define GSInternal NSXMLElementInternal
#define GS_XMLNODETYPE xmlNode
#import "NSXMLPrivate.h"
#import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLElement)
@ -133,7 +135,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
NSMutableArray *results = [NSMutableArray arrayWithCapacity: 10];
xmlNodePtr cur = NULL;
for (cur = MY_NODE->children; cur != NULL; cur = cur->next)
for (cur = internal->node->children; cur != NULL; cur = cur->next)
{
NSString *n = StringFromXMLStringPtr(cur->name);
if ([n isEqualToString: name])
@ -154,7 +156,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
- (void) addAttribute: (NSXMLNode*)attribute
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
xmlAttrPtr attr = (xmlAttrPtr)[attribute _node];
xmlAttrPtr oldAttr = xmlHasProp(node, attr->name);
@ -194,7 +196,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
- (void) removeAttributeForName: (NSString*)name
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
xmlAttrPtr attr = xmlHasProp(node, XMLSTRING(name));
NSXMLNode *attrNode = nil;
@ -242,7 +244,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
- (NSArray*) attributes
{
NSMutableArray *attributes = [NSMutableArray array];
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
xmlAttrPtr attributeNode = node->properties;
while (attributeNode)
@ -259,7 +261,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
- (NSXMLNode*) attributeForName: (NSString*)name
{
NSXMLNode *result = nil;
xmlAttrPtr attributeNode = xmlHasProp(MY_NODE, XMLSTRING(name));
xmlAttrPtr attributeNode = xmlHasProp(internal->node, XMLSTRING(name));
if (NULL != attributeNode)
{
@ -280,13 +282,13 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
{
xmlNsPtr ns = (xmlNsPtr)[aNamespace _node];
if (MY_NODE->ns == NULL)
if (internal->node->ns == NULL)
{
MY_NODE->ns = ns;
internal->node->ns = ns;
}
else
{
xmlNsPtr cur = MY_NODE->ns;
xmlNsPtr cur = internal->node->ns;
const xmlChar *prefix = ns->prefix;
while (xmlStrcmp(prefix, cur->prefix) != 0)
@ -313,14 +315,14 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
xmlNsPtr cur = NULL;
// FIXME: Remove old namespaces
// xmlFreeNsList(MY_NODE->ns);
// MY_NODE->ns = NULL;
// xmlFreeNsList(internal->node->ns);
// internal->node->ns = NULL;
while ((namespace = (NSXMLNode *)[en nextObject]) != nil)
{
xmlNsPtr ns = (xmlNsPtr)[namespace _node];
if (MY_NODE->ns == NULL)
if (internal->node->ns == NULL)
{
MY_NODE->ns = ns;
internal->node->ns = ns;
cur = ns;
}
else
@ -335,7 +337,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
{
// FIXME: Should use xmlGetNsList()
NSMutableArray *result = nil;
xmlNsPtr ns = MY_NODE->ns;
xmlNsPtr ns = internal->node->ns;
if (ns)
{
@ -353,7 +355,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
- (NSXMLNode*) namespaceForPrefix: (NSString*)name
{
// FIXME: Should use xmlSearchNs()
xmlNsPtr ns = MY_NODE->ns;
xmlNsPtr ns = internal->node->ns;
if (ns)
{
const xmlChar *prefix = XMLSTRING(name);
@ -385,7 +387,7 @@ GS_PRIVATE_INTERNAL(NSXMLElement)
- (NSString*) resolvePrefixForNamespaceURI: (NSString*)namespaceURI
{
// FIXME Should use xmlSearchNsByHref()
xmlNsPtr ns = MY_NODE->ns;
xmlNsPtr ns = internal->node->ns;
if (ns)
{

280
Source/NSXMLNamespace.m Normal file
View file

@ -0,0 +1,280 @@
/* Implementation for NSXMLNamespace for GNUStep
Copyright (C) 2008 Free Software Foundation, Inc.
Written by: Richard Frith-Macdonald <rfm@gnu.org>
Created: September 2008
This file is part of the GNUstep Base Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02111 USA.
*/
#import "common.h"
#define GSInternal NSXMLNamespaceInternal
#define GS_XMLNODETYPE xmlNs
#import "NSXMLPrivate.h"
@interface NSXMLNamespace : NSXMLNode
{
@public GS_NSXMLNamespace_IVARS
/* The pointer to private additional data used to avoid breaking ABI
* when we don't have the non-fragile ABI available is inherited from
* NSXMLNode. See Source/GSInternal.h for details.
*/
}
@end
#import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLNamespace)
#if defined(HAVE_LIBXML)
static void
clearPrivatePointers(xmlNodePtr aNode)
{
if (!aNode)
return;
aNode->_private = NULL;
clearPrivatePointers(aNode->children);
clearPrivatePointers(aNode->next);
if (aNode->type == XML_ELEMENT_NODE)
clearPrivatePointers((xmlNodePtr)(aNode->properties));
// FIXME: Handle more node types
}
@implementation NSXMLNamespace
- (NSString*) canonicalXMLStringPreservingComments: (BOOL)comments
{
return [self notImplemented: _cmd]; // FIXME ... generate from libxml
}
- (NSXMLNode*) childAtIndex: (NSUInteger)index
{
return nil;
}
- (NSUInteger) childCount
{
return 0;
}
- (NSArray*) children
{
return nil;
}
- (id) copyWithZone: (NSZone*)zone
{
NSXMLNamespace *c = [[self class] allocWithZone: zone];
// FIXME
GSIVar(c, options) = internal->options;
if (nil != internal->objectValue)
{
/*
Only copy the objectValue when externally set.
The problem here are nodes created by parsing XML.
There the stringValue may be set, but the objectValue isn't.
This should rather be solved by creating a suitable objectValue,
when the node gets instantiated.
*/
[c setObjectValue: internal->objectValue];
}
[c setURI: [self URI]];
// [c setName: [self name]];
// [c setStringValue: [self stringValue]];
return c;
}
- (NSString*) description
{
return [NSString stringWithFormat:@"<%@ %@ %d>%@\n",
NSStringFromClass([self class]),
[self name], [self kind], [self XMLString]];
}
- (void) dealloc
{
if (GS_EXISTS_INTERNAL)
{
xmlNs *old = internal->node;
// FIXME
if (old)
{
old->_private = NULL;
xmlFreeNs(old);
}
GS_DESTROY_INTERNAL(NSXMLNode);
}
[super dealloc];
}
- (void) detach
{
xmlNsPtr ns = internal->node;
if (ns)
{
// FIXME
}
}
- (NSUInteger) hash
{
return [[self name] hash];
}
- (NSUInteger) index
{
return 0;
}
- (id) init
{
return [self initWithKind: NSXMLNamespaceKind];
}
- (NSUInteger) level
{
return 0;
}
- (NSString*) localName
{
return [[self class] localNameForName: [self name]];
}
- (NSString*) name
{
return nil;
}
- (NSXMLNode*) nextNode
{
return nil;
}
- (NSXMLNode*) nextSibling
{
return nil;
}
- (id) objectValue
{
return nil;
}
- (NSXMLNode*) parent
{
return nil;
}
- (NSString*) prefix
{
return StringFromXMLStringPtr(internal->node->prefix);
}
- (NSXMLNode*) previousNode
{
return nil;
}
- (NSXMLNode*) previousSibling
{
return nil;
}
- (NSXMLDocument*) rootDocument
{
return nil;
}
- (NSString*) stringValue
{
return StringFromXMLStringPtr(internal->node->href);
}
- (void) setObjectValue: (id)value
{
return;
}
- (void) setName: (NSString *)name
{
return;
}
- (void) setStringValue: (NSString*)string
{
[self setStringValue: string resolvingEntities: NO];
}
- (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve
{
return;
}
- (void) setURI: (NSString*)URI
{
//xmlNodeSetBase(internal->node, XMLSTRING(URI));
}
- (NSString*) URI
{
return StringFromXMLStringPtr(internal->node->href);
}
- (NSString*) XMLString
{
return [self XMLStringWithOptions: NSXMLNodeOptionsNone];
}
- (NSString*) XMLStringWithOptions: (NSUInteger)options
{
return nil;
}
- (NSString*) XPath
{
return nil;
}
- (NSArray*) nodesForXPath: (NSString*)anxpath error: (NSError**)error
{
return nil;
}
- (NSArray*) objectsForXQuery: (NSString*)xquery
constants: (NSDictionary*)constants
error: (NSError**)error
{
return nil;
}
- (NSArray*) objectsForXQuery: (NSString*)xquery error: (NSError**)error
{
return nil;
}
@end
#endif

View file

@ -24,15 +24,16 @@
#import "common.h"
#define GSInternal NSXMLNodeInternal
#define GSInternal NSXMLNodeInternal
#define GS_XMLNODETYPE xmlNode
#import "NSXMLPrivate.h"
#import "GSInternal.h"
GS_PRIVATE_INTERNAL(NSXMLNode)
#if defined(HAVE_LIBXML)
@interface NSXMLNamespaceNode : NSXMLNode
@end
@class NSXMLNamespace;
static int
countAttributes(xmlNodePtr node)
@ -209,26 +210,10 @@ isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB)
return NO;
}
/* FIXME ... the libxml2 data structure representing a namespace has a
* completely different layout from that of almost all other nodes, so
* the generix NSXMLNode code won't work and we need to override every
* method we use!
*/
@implementation NSXMLNamespaceNode
- (NSUInteger) level
{
return 0;
}
- (NSXMLNode*) parent
{
return nil;
}
@end
@implementation NSXMLNode (Private)
- (void *) _node
{
return MY_NODE;
return internal->node;
}
- (void) _setNode: (void *)_anode
@ -379,7 +364,7 @@ isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB)
- (xmlNodePtr) _childNodeAtIndex: (NSUInteger)index
{
NSUInteger count = 0;
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
xmlNodePtr children = node->children;
if (!children)
@ -403,7 +388,7 @@ isEqualTree(xmlNodePtr nodeA, xmlNodePtr nodeB)
*/
// Get all of the nodes...
xmlNodePtr parentNode = MY_NODE; // we are the parent
xmlNodePtr parentNode = internal->node; // we are the parent
xmlNodePtr childNode = (xmlNodePtr)[child _node];
xmlNodePtr curNode = [self _childNodeAtIndex: index];
BOOL mergeTextNodes = NO; // is there a defined option for this?
@ -857,7 +842,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
{
NSUInteger count = 0;
xmlNodePtr children = NULL;
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
if (!node)
{
@ -883,7 +868,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
else
{
xmlNodePtr children = NULL;
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
if ((node == NULL) || (node->children == NULL))
{
@ -938,7 +923,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
{
if (GS_EXISTS_INTERNAL)
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
NSArray *subNodes = [internal->subNodes copy];
NSEnumerator *enumerator = [subNodes objectEnumerator];
NSXMLNode *subNode;
@ -968,7 +953,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
- (void) detach
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
if (node)
{
@ -992,7 +977,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
- (NSUInteger) index
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
int count = 0;
while ((node = node->prev))
@ -1046,7 +1031,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
break;
case NSXMLNamespaceKind:
theSubclass = [NSXMLNamespaceNode class];
theSubclass = [NSXMLNamespace class];
break;
case NSXMLAttributeKind:
@ -1145,7 +1130,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
NSLog(@"s sV '%@' oV '%@', other sV '%@' oV '%@'", [self stringValue], [self objectValue],
[other stringValue], [other objectValue]);
*/
return isEqualTree(MY_NODE, (xmlNodePtr)[other _node]);
return isEqualTree(internal->node, (xmlNodePtr)[other _node]);
}
- (NSXMLNodeKind) kind
@ -1158,12 +1143,12 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
NSUInteger level = 0;
xmlNodePtr tmp;
if (!MY_NODE)
if (!internal->node)
{
return 0;
}
tmp = MY_NODE->parent;
tmp = internal->node->parent;
while (tmp != NULL)
{
level++;
@ -1183,7 +1168,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
{
return nil;
}
return StringFromXMLStringPtr(MY_NODE->name);
return StringFromXMLStringPtr(internal->node->name);
}
- (NSXMLNode*) _nodeFollowingInNaturalDirection: (BOOL)forward
@ -1242,7 +1227,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
- (NSXMLNode*) nextSibling
{
return [NSXMLNode _objectForNode: MY_NODE->next];
return [NSXMLNode _objectForNode: internal->node->next];
}
- (id) objectValue
@ -1252,7 +1237,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
- (NSXMLNode*) parent
{
return [NSXMLNode _objectForNode: MY_NODE->parent];
return [NSXMLNode _objectForNode: internal->node->parent];
}
- (NSString*) prefix
@ -1267,18 +1252,18 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
- (NSXMLNode*) previousSibling
{
return [NSXMLNode _objectForNode: MY_NODE->prev];
return [NSXMLNode _objectForNode: internal->node->prev];
}
- (NSXMLDocument*) rootDocument
{
return
(NSXMLDocument *)[NSXMLNode _objectForNode: (xmlNodePtr)(MY_NODE->doc)];
(NSXMLDocument *)[NSXMLNode _objectForNode: (xmlNodePtr)(internal->node->doc)];
}
- (NSString*) stringValue
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
xmlChar *content = xmlNodeGetContent(node);
NSString *result = nil;
@ -1321,7 +1306,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
return;
}
xmlNodeSetName(MY_NODE, XMLSTRING(name));
xmlNodeSetName(internal->node, XMLSTRING(name));
}
- (void) setStringValue: (NSString*)string
@ -1331,7 +1316,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
- (void) setStringValue: (NSString*)string resolvingEntities: (BOOL)resolve
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
if (resolve == NO)
{
@ -1355,7 +1340,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
return;
}
ASSIGNCOPY(internal->URI, URI);
//xmlNodeSetBase(MY_NODE, XMLSTRING(URI));
//xmlNodeSetBase(internal->node, XMLSTRING(URI));
}
- (NSString*) URI
@ -1365,7 +1350,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
return nil;
}
return internal->URI;
//return StringFromXMLStringPtr(xmlNodeGetBase(NULL, MY_NODE));
//return StringFromXMLStringPtr(xmlNodeGetBase(NULL, internal->node));
}
- (NSString*) XMLString
@ -1399,7 +1384,7 @@ execute_xpath(NSXMLNode *xmlNode, NSString *xpath_exp, NSString *nmspaces)
- (NSString*) XPath
{
xmlNodePtr node = MY_NODE;
xmlNodePtr node = internal->node;
return StringFromXMLStringPtr(xmlGetNodePath(node));
}

View file

@ -81,29 +81,12 @@ StringFromXMLString(const unsigned char *bytes, unsigned length)
return AUTORELEASE(str);
}
#define MY_DOC ((xmlDoc *)internal->node)
#define MY_NODE ((xmlNode *)internal->node)
#define MY_ATTR ((xmlAttr *)internal->node)
#define MY_ELEM ((xmlElement *)internal->node)
#define MY_DTD ((xmlDtd *)internal->node)
/* Instance variables for NSXMLNode. This macro needs to be defined before
* the NSXMLNode.h header is imported and before GSInternal.h is imported.
*
* Description of internal ivars:
* - `children': The primary storage for the descendant nodes. We use an NSArray
* here until somebody finds out it's not fast enough.
* - `childCount': For efficiency, we cache the count. This means we need to
* update it whenever the children change.
* - `previousSibling', `nextSibling': Tree walking is a common operation for
* XML. [parent->children objectAtIndex: index + 1] would be a
* straightforward way to obtain the next sibling of the node, but it hurts
* performance quite a bit. So we cache the siblings and update them when the
* nodes are changed.
*/
#define GS_NSXMLNode_IVARS \
NSUInteger kind; \
void *node; \
GS_XMLNODETYPE *node; \
NSUInteger options; \
id objectValue; \
NSString *URI; \
@ -163,6 +146,14 @@ StringFromXMLString(const unsigned char *bytes, unsigned length)
*/
#define GS_NSXMLElement_IVARS SUPERIVARS(GS_NSXMLNode_IVARS)
/* Instance variables for NSXMLNamespace with/without the instance
* variable 'inherited' from NSXMLNode.
* This macro needs to be defined before the NSXMLNamespace interface
* is declared and before GSInternal.h is imported.
*/
#define GS_NSXMLNamespace_IVARS SUPERIVARS(GS_NSXMLNode_IVARS)
#import "Foundation/NSArray.h"
#import "Foundation/NSData.h"
#import "Foundation/NSDebug.h"
@ -208,9 +199,9 @@ StringFromXMLString(const unsigned char *bytes, unsigned length)
- (void *) _node;
- (void) _setNode: (void *)_anode;
+ (NSXMLNode *) _objectForNode: (xmlNodePtr)node;
- (void) _addSubNode:(NSXMLNode *)subNode;
- (void) _removeSubNode:(NSXMLNode *)subNode;
- (id) _initWithNode:(xmlNodePtr)node kind:(NSXMLNodeKind)kind;
- (void) _addSubNode: (NSXMLNode *)subNode;
- (void) _removeSubNode: (NSXMLNode *)subNode;
- (id) _initWithNode: (xmlNodePtr)node kind: (NSXMLNodeKind)kind;
- (xmlNodePtr) _childNodeAtIndex: (NSUInteger)index;
- (void) _insertChild: (NSXMLNode*)child atIndex: (NSUInteger)index;
- (void) _invalidate;