Added pre-alpha NSXMLPzarser compatibility layer.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@20238 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-Macdonald 2004-10-20 10:48:04 +00:00
parent 95954a9914
commit 8e9075305e
8 changed files with 1068 additions and 0 deletions

View file

@ -1,3 +1,17 @@
2004-10-20 Richard Frith-Macdonald <rfm@gnu.org>
* Headers/Foundation/Foundation.h: include NSXMLParser
* Headers/Foundation/NSXMLParser.h: MacOS compatibility class
* Source/DocMakefile: Add NSXMLParser
* Source/GNUmakefile: Add NSXMLParser
* Source/NSXMLParser.m: Wrap some GSXML functionality for compatibility.
* Testing/GNUmakefile: Add nsxmlparser
* Testing/nsxmlparser.m: Trivial/basic test for parser
Committed the work I did back in May as there have been several
expressions of interest. I haven't had time to do work on this
and consider the code pre-alpha. Reaching full MacOS-X compatibility
may require minor extension to GSXML.
2004-10-17 Matt Rice <ratmice@yahoo.com
* Source/objc-load.m (objc_load_module): resolve class links under GNU

View file

@ -92,6 +92,7 @@
#include <Foundation/NSUndoManager.h>
#include <Foundation/NSUserDefaults.h>
#include <Foundation/NSValue.h>
#include <Foundation/NSXMLParser.h>
#include <Foundation/NSZone.h>
#endif /* __Foundation_h_GNUSTEP_BASE_INCLUDE */

View file

@ -0,0 +1,368 @@
/** Interface for NSXMLParser for GNUStep
Copyright (C) 2004 Free Software Foundation, Inc.
Written by: Richard Frith-Macdonald <rfm@gnu.org>
Date: May 2004
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 Library General Public
License as published by the Free Software Foundation; either
version 2 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 Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
AutogsdocSource: NSXMLParser.m
*/
#ifndef __NSXMLParser_h_GNUSTEP_BASE_INCLUDE
#define __NSXMLParser_h_GNUSTEP_BASE_INCLUDE
#ifndef STRICT_OPENSTEP
#include <Foundation/NSObject.h>
@class NSData, NSDictionary, NSError, NSString, NSURL;
/**
* Domain for errors
*/
GS_EXPORT NSString* const NSXMLParserErrorDomain;
/**
* This class is a PRE-ALPHA implementation. You should be prepared to
* track down and fix bugs and prefereably contribute fixes back.<br />
* If you don't want to do that, use the [GSXMLParser] class instead ...
* This NSXMLParser class is implemented as a wrapper round some of the
* functionality of the more powerful GSXML APis, and is intended as a
* MacOSX compatibility feature.
* <p>
* This class implements an event driven parser handling the parsing
* process by sending messages to a delegate when certain parts of the
* XML document being parsed are encountered.
* </p>
* <p>
* To use the class, you create and initialise an instance with a particular
* XML document, set the delegate of the instance, and send a -parse message
* to it. The delegate must then make use of the information it receives
* in the messages it gets from the parser.
* </p>
* <p>
* The [NSObject(NSXMLParserDelegateEventAdditions)] informal protocol
* documents the methods which the delegate object may implement in order
* to handle the parsing process.
* </p>
*/
@interface NSXMLParser : NSObject
{
@private
void *_parser; // GSXMLParser
void *_handler; // SAXHandler
}
/**
* Terminates the current parse operation and sends an error to the
* delegate of the parser.
*/
- (void) abortParsing;
/**
* Returns the delegate previously set using -setDelegate: or nil if
* no delegate is set.
*/
- (id) delegate;
/**
* Convenience method fetching data from anURL.<br />
*/
- (id) initWithContentsOfURL: (NSURL*)anURL;
/** <init />
* Initialises the parser with the specified xml data.
*/
- (id) initWithData: (NSData*)data;
/**
* Parses the supplied data and returns YES on succdess, NO otherwise.
*/
- (BOOL) parse;
/**
* Returns the last error produced by parsing (if any).
*/
- (NSError*) parserError;
/**
* Sets the parser delegate (which is not retained).
*/
- (void) setDelegate: (id)delegate;
/**
* Set flag to determine whether the namespaceURI and the qualified name
* of an element is provided in the
* [NSObject-parser:didStartElement:namespaceURI:qualifiedName:attributes:]
* and [NSObject-parser:didEndElement:namespaceURI:qualifiedName:] methods.
*/
- (void) setShouldProcessNamespaces: (BOOL)aFlag;
/**
* Sets a flag to specify whether the parser should call the
* [NSObject-parser:didStartMappingPrefix:toURI:] and
* [NSObject-parser:didEndMappingPrefix:] delegate methods.
*/
- (void) setShouldReportNamespacePrefixes: (BOOL)aFlag;
/**
* Sets flag to determine if declarations of external entities are
* reported using
* [NSObject-parser:foundExternalEntityDeclarationWithName:publicID:systemID:]
*/
- (void) setShouldResolveExternalEntities: (BOOL)aFlag;
/**
* Returns the value set by -setShouldProcessNamespaces:
*/
- (BOOL) shouldProcessNamespaces;
/**
* Returns the value set by -setShouldReportNamespacePrefixes:
*/
- (BOOL) shouldReportNamespacePrefixes;
/**
* Returns the value set by -setShouldResolveExternalEntities:
*/
- (BOOL) shouldResolveExternalEntities;
@end
@interface NSXMLParser (NSXMLParserLocatorAdditions)
/**
* Returns the current column number of the document being parsed.
*/
- (int) columnNumber;
/**
* Returns the current line number of the document being parsed.
*/
- (int) lineNumber;
/**
* Returns the public identifier of the external entity in the
* document being parsed.
*/
- (NSString*) publicID;
/**
* Returns the system identifier of the external entity in the
* document being parsed.
*/
- (NSString*) systemID;
@end
/**
* Methods implemented by a delegate in order to make use of the parser.<br />
* This is an informal protocol.
*/
@interface NSObject (NSXMLParserDelegateEventAdditions)
- (NSData*) parser: (NSXMLParser*)aParser
resolveExternalEntityName: (NSString*)aName
systemID: (NSString*)aSystemID;
- (void) parser: (NSXMLParser*)aParser
didEndElement: (NSString*)anElementName
namespaceURI: (NSString*)aNamespaceURI
qualifiedName: (NSString*)aQualifierName;
- (void) parser: (NSXMLParser*)aParser
didEndMappingPrefix: (NSString*)aPrefix;
/**
* Called when the start of an element is encountered in the document,
* this provides the name of the element, a dictionary containing the
* attributes (if any) and (where namespaces are used) the namespace
* information for the element.
*/
- (void) parser: (NSXMLParser*)aParser
didStartElement: (NSString*)anElementName
namespaceURI: (NSString*)aNamespaceURI
qualifiedName: (NSString*)aQualifierName
attributes: (NSDictionary*)anAttributeDict;
- (void) parser: (NSXMLParser*)aParser
didStartMappingPrefix: (NSString*)aPrefix
toURI: (NSString*)aNamespaceURI;
- (void) parser: (NSXMLParser*)aParser
foundAttributeDeclarationWithName: (NSString*)anAttributeName
forElement: (NSString*)anElementName
type: (NSString*)aType
defaultValue: (NSString*)aDefaultValue;
- (void) parser: (NSXMLParser*)aParser
foundCDATA: (NSData*)aBlock;
- (void) parser: (NSXMLParser*)aParser
foundCharacters: (NSString*)aString;
- (void) parser: (NSXMLParser*)aParser
foundComment: (NSString*)aComment;
- (void) parser: (NSXMLParser*)aParser
foundElementDeclarationWithName: (NSString*)anElementName
model: (NSString*)aModel;
- (void) parser: (NSXMLParser*)aParser
foundExternalEntityDeclarationWithName: (NSString*)aName
publicID: (NSString*)aPublicID
systemID: (NSString*)aSystemID;
- (void) parser: (NSXMLParser*)aParser
foundIgnorableWhitespace: (NSString*)aWhitespaceString;
- (void) parser: (NSXMLParser*)aParser
foundInternalEntityDeclarationWithName: (NSString*)aName
value: (NSString*)aValue;
- (void) parser: (NSXMLParser*)aParser
foundNotationDeclarationWithName: (NSString*)aName
publicID: (NSString*)aPublicID
systemID: (NSString*)aSystemID;
- (void) parser: (NSXMLParser*)aParser
foundProcessingInstructionWithTarget: (NSString*)aTarget
data: (NSString*)aData;
- (void) parser: (NSXMLParser*)aParser
foundUnparsedEntityDeclarationWithName: (NSString*)aName
publicID: (NSString*)aPublicID
systemID: (NSString*)aSystemID
notationName: (NSString*)aNotationName;
- (void) parser: (NSXMLParser*)aParser
parseErrorOccurred: (NSError*)anError;
- (void) parser: (NSXMLParser*)aParser
validationErrorOccurred: (NSError*)anError;
/**
* Called when parsing ends.
*/
- (void) parserDidEndDocument: (NSXMLParser*)aParser;
/**
* Called when parsing begins.
*/
- (void) parserDidStartDocument: (NSXMLParser*)aParser;
@end
/*
* Provide the same error codes as MacOS-X, even if we don't use them all.
*/
typedef enum {
NSXMLParserInternalError = 1,
NSXMLParserOutOfMemoryError = 2,
NSXMLParserDocumentStartError = 3,
NSXMLParserEmptyDocumentError = 4,
NSXMLParserPrematureDocumentEndError = 5,
NSXMLParserInvalidHexCharacterRefError = 6,
NSXMLParserInvalidDecimalCharacterRefError = 7,
NSXMLParserInvalidCharacterRefError = 8,
NSXMLParserInvalidCharacterError = 9,
NSXMLParserCharacterRefAtEOFError = 10,
NSXMLParserCharacterRefInPrologError = 11,
NSXMLParserCharacterRefInEpilogError = 12,
NSXMLParserCharacterRefInDTDError = 13,
NSXMLParserEntityRefAtEOFError = 14,
NSXMLParserEntityRefInPrologError = 15,
NSXMLParserEntityRefInEpilogError = 16,
NSXMLParserEntityRefInDTDError = 17,
NSXMLParserParsedEntityRefAtEOFError = 18,
NSXMLParserParsedEntityRefInPrologError = 19,
NSXMLParserParsedEntityRefInEpilogError = 20,
NSXMLParserParsedEntityRefInInternalSubsetError = 21,
NSXMLParserEntityReferenceWithoutNameError = 22,
NSXMLParserEntityReferenceMissingSemiError = 23,
NSXMLParserParsedEntityRefNoNameError = 24,
NSXMLParserParsedEntityRefMissingSemiError = 25,
NSXMLParserUndeclaredEntityError = 26,
NSXMLParserUnparsedEntityError = 28,
NSXMLParserEntityIsExternalError = 29,
NSXMLParserEntityIsParameterError = 30,
NSXMLParserUnknownEncodingError = 31,
NSXMLParserEncodingNotSupportedError = 32,
NSXMLParserStringNotStartedError = 33,
NSXMLParserStringNotClosedError = 34,
NSXMLParserNamespaceDeclarationError = 35,
NSXMLParserEntityNotStartedError = 36,
NSXMLParserEntityNotFinishedError = 37,
NSXMLParserLessThanSymbolInAttributeError = 38,
NSXMLParserAttributeNotStartedError = 39,
NSXMLParserAttributeNotFinishedError = 40,
NSXMLParserAttributeHasNoValueError = 41,
NSXMLParserAttributeRedefinedError = 42,
NSXMLParserLiteralNotStartedError = 43,
NSXMLParserLiteralNotFinishedError = 44,
NSXMLParserCommentNotFinishedError = 45,
NSXMLParserProcessingInstructionNotStartedError = 46,
NSXMLParserProcessingInstructionNotFinishedError = 47,
NSXMLParserNotationNotStartedError = 48,
NSXMLParserNotationNotFinishedError = 49,
NSXMLParserAttributeListNotStartedError = 50,
NSXMLParserAttributeListNotFinishedError = 51,
NSXMLParserMixedContentDeclNotStartedError = 52,
NSXMLParserMixedContentDeclNotFinishedError = 53,
NSXMLParserElementContentDeclNotStartedError = 54,
NSXMLParserElementContentDeclNotFinishedError = 55,
NSXMLParserXMLDeclNotStartedError = 56,
NSXMLParserXMLDeclNotFinishedError = 57,
NSXMLParserConditionalSectionNotStartedError = 58,
NSXMLParserConditionalSectionNotFinishedError = 59,
NSXMLParserExternalSubsetNotFinishedError = 60,
NSXMLParserDOCTYPEDeclNotFinishedError = 61,
NSXMLParserMisplacedCDATAEndStringError = 62,
NSXMLParserCDATANotFinishedError = 63,
NSXMLParserMisplacedXMLDeclarationError = 64,
NSXMLParserSpaceRequiredError = 65,
NSXMLParserSeparatorRequiredError = 66,
NSXMLParserNMTOKENRequiredError = 67,
NSXMLParserNAMERequiredError = 68,
NSXMLParserPCDATARequiredError = 69,
NSXMLParserURIRequiredError = 70,
NSXMLParserPublicIdentifierRequiredError = 71,
NSXMLParserLTRequiredError = 72,
NSXMLParserGTRequiredError = 73,
NSXMLParserLTSlashRequiredError = 74,
NSXMLParserEqualExpectedError = 75,
NSXMLParserTagNameMismatchError = 76,
NSXMLParserUnfinishedTagError = 77,
NSXMLParserStandaloneValueError = 78,
NSXMLParserInvalidEncodingNameError = 79,
NSXMLParserCommentContainsDoubleHyphenError = 80,
NSXMLParserInvalidEncodingError = 81,
NSXMLParserExternalStandaloneEntityError = 82,
NSXMLParserInvalidConditionalSectionError = 83,
NSXMLParserEntityValueRequiredError = 84,
NSXMLParserNotWellBalancedError = 85,
NSXMLParserExtraContentError = 86,
NSXMLParserInvalidCharacterInEntityError = 87,
NSXMLParserParsedEntityRefInInternalError = 88,
NSXMLParserEntityRefLoopError = 89,
NSXMLParserEntityBoundaryError = 90,
NSXMLParserInvalidURIError = 91,
NSXMLParserURIFragmentError = 92,
NSXMLParserNoDTDError = 94,
NSXMLParserDelegateAbortedParseError = 512
} NSXMLParserError;
#endif /* STRICT_OPENSTEP */
#endif /* __NSXMLParser_h_GNUSTEP_BASE_INCLUDE*/

View file

@ -101,6 +101,7 @@ NSURLHandle.h \
NSUndoManager.h \
NSUserDefaults.h \
NSValue.h \
NSXMLParser.h \
NSZone.h
BaseAdditions_AGSDOC_FILES = \

View file

@ -223,6 +223,7 @@ NSURLHandle.m \
NSUser.m \
NSUserDefaults.m \
NSValue.m \
NSXMLParser.m \
NSZone.m \
externs.m \
objc-load.m
@ -333,6 +334,7 @@ NSUndoManager.h \
NSUserDefaults.h \
NSUtilities.h \
NSValue.h \
NSXMLParser.h \
NSZone.h
UNICODE_HEADERS = \

559
Source/NSXMLParser.m Normal file
View file

@ -0,0 +1,559 @@
/** Implementation for NSXMLParser for GNUStep
Copyright (C) 2004 Free Software Foundation, Inc.
Written by: Richard Frith-Macdonald <rfm@gnu.org>
Date: May 2004
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 Library General Public
License as published by the Free Software Foundation; either
version 2 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 Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
*/
#include <Additions/GNUstepBase/GSXML.h>
#include <Foundation/NSError.h>
#include <Foundation/NSException.h>
#include <Foundation/NSXMLParser.h>
#include <Foundation/NSData.h>
#include <Foundation/NSObjCRuntime.h>
NSString* const NSXMLParserErrorDomain = @"NSXMLParserErrorDomain";
@interface NSXMLSAXHandler : GSSAXHandler
{
@public
id _delegate;
id _owner;
NSError *_lastError;
BOOL _shouldProcessNamespaces;
BOOL _shouldReportNamespacePrefixes;
BOOL _shouldResolveExternalEntities;
}
- (void) _setOwner: (id)owner;
@end
@implementation NSXMLSAXHandler
- (void) endDocument
{
[_delegate parserDidEndDocument: _owner];
}
- (void) startDocument
{
[_delegate parserDidStartDocument: _owner];
}
- (void) startElement: (NSString*)elementName
prefix: (NSString*)prefix
href: (NSString*)href
attributes: (NSMutableDictionary*)elementAttributes
{
if (_shouldProcessNamespaces)
{
[_delegate parser: _owner
didStartElement: elementName
namespaceURI: href
qualifiedName: prefix
attributes: elementAttributes];
}
else
{
[_delegate parser: _owner
didStartElement: elementName
namespaceURI: nil
qualifiedName: nil
attributes: elementAttributes];
}
}
- (void) endElement: (NSString*) elementName
prefix: (NSString*)prefix
href: (NSString*)href
{
if (_shouldProcessNamespaces)
{
[_delegate parser: _owner
didEndElement: elementName
namespaceURI: href
qualifiedName: prefix];
}
else
{
[_delegate parser: _owner
didEndElement: elementName
namespaceURI: nil
qualifiedName: nil];
}
}
- (void) attribute: (NSString*) name value: (NSString*)value
{
// FIXME
}
- (void) characters: (NSString*)string
{
[_delegate parser: _owner
foundCharacters: string];
}
- (void) ignoreWhitespace: (NSString*) ch
{
[_delegate parser: _owner
foundIgnorableWhitespace: ch];
}
- (void) processInstruction: (NSString*)targetName data: (NSString*)PIdata
{
[_delegate parser: _owner
foundProcessingInstructionWithTarget: targetName
data: PIdata];
}
- (void) comment: (NSString*) value
{
[_delegate parser: _owner
foundComment: value];
}
- (void) cdataBlock: (NSData*)value
{
[_delegate parser: _owner
foundCDATA: value];
}
/**
* Called to return the filename from which an entity should be loaded.
*/
- (NSString*) loadEntity: (NSString*)publicId
at: (NSString*)location
{
return nil;
}
/**
* An old global namespace has been parsed.
*/
- (void) namespaceDecl: (NSString*)name
href: (NSString*)href
prefix: (NSString*)prefix
{
}
- (void) notationDecl: (NSString*)name
public: (NSString*)publicId
system: (NSString*)systemId
{
[_delegate parser: _owner
foundNotationDeclarationWithName: name
publicID: publicId
systemID: systemId];
}
/**
* An entity definition has been parsed.
*/
- (void) entityDecl: (NSString*)name
type: (int)type
public: (NSString*)publicId
system: (NSString*)systemId
content: (NSString*)content
{
}
- (void) attributeDecl: (NSString*)nameElement
name: (NSString*)name
type: (int)type
typeDefValue: (int)defType
defaultValue: (NSString*)value
{
[_delegate parser: _owner
foundAttributeDeclarationWithName: name
forElement: nameElement
type: nil // FIXME
defaultValue: value];
}
- (void) elementDecl: (NSString*)name
type: (int)type
{
[_delegate parser: _owner
foundElementDeclarationWithName: name
model: nil]; // FIXME
}
/**
* What to do when an unparsed entity declaration is parsed.
*/
- (void) unparsedEntityDecl: (NSString*)name
public: (NSString*)publicId
system: (NSString*)systemId
notationName: (NSString*)notation
{
}
/**
* Called when an entity reference is detected.
*/
- (void) reference: (NSString*) name
{
}
/**
* An old global namespace has been parsed.
*/
- (void) globalNamespace: (NSString*)name
href: (NSString*)href
prefix: (NSString*)prefix
{
}
/**
* Called when a warning message needs to be output.
*/
- (void) warning: (NSString*)e
{
GSPrintf(stderr, @"%@", e);
}
- (void) error: (NSString*)e
{
NSError *error;
NSDictionary *d;
d = [NSDictionary dictionaryWithObjectsAndKeys:
e, NSLocalizedDescriptionKey,
nil];
error = [NSError errorWithDomain: NSXMLParserErrorDomain
code: 0
userInfo: d];
ASSIGN(_lastError, error);
[_delegate parser: _owner
parseErrorOccurred: error];
}
- (void) fatalError: (NSString*)e
{
[self error: e];
}
- (void) warning: (NSString*)e
colNumber: (int)colNumber
lineNumber: (int)lineNumber
{
e = [NSString stringWithFormat: @"at line: %d column: %d ... %@",
lineNumber, colNumber, e];
[self warning: e];
}
- (void) error: (NSString*)e
colNumber: (int)colNumber
lineNumber: (int)lineNumber
{
e = [NSString stringWithFormat: @"at line: %d column: %d ... %@",
lineNumber, colNumber, e];
[self error: e];
}
- (void) fatalError: (NSString*)e
colNumber: (int)colNumber
lineNumber: (int)lineNumber
{
e = [NSString stringWithFormat: @"at line: %d column: %d ... %@",
lineNumber, colNumber, e];
[self fatalError: e];
}
- (int) hasInternalSubset
{
return 0;
}
- (BOOL) internalSubset: (NSString*)name
externalID: (NSString*)externalID
systemID: (NSString*)systemID
{
return NO;
}
- (int) hasExternalSubset
{
return 0;
}
- (BOOL) externalSubset: (NSString*)name
externalID: (NSString*)externalID
systemID: (NSString*)systemID
{
return NO;
}
- (void*) getEntity: (NSString*)name
{
return 0;
}
- (void*) getParameterEntity: (NSString*)name
{
return 0;
}
- (void) _setOwner: (id)owner
{
ASSIGN(_owner, owner);
}
@end
@implementation NSXMLParser
#define myParser ((GSXMLParser*)_parser)
#define myHandler ((NSXMLSAXHandler*)_handler)
- (void) abortParsing
{ // FIXME
NSDictionary *d;
NSString *e;
NSError *error;
e = @"Parsing aborted";
d = [NSDictionary dictionaryWithObjectsAndKeys:
e, NSLocalizedDescriptionKey,
nil];
error = [NSError errorWithDomain: NSXMLParserErrorDomain
code: 0
userInfo: d];
ASSIGN(myHandler->_lastError, error);
[myHandler->_delegate parser: myHandler->_owner parseErrorOccurred: error];
[NSException raise: NSGenericException format: @"[%@-%@] not yet implemented",
NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
}
- (void) dealloc
{
DESTROY((id)_parser);
DESTROY((id)_handler);
[super dealloc];
}
- (id) delegate
{
return myHandler->_delegate;
}
- (id) initWithContentsOfURL: (NSURL*)anURL
{
NSData *d = [NSData dataWithContentsOfURL: anURL];
if (d == nil)
{
DESTROY(self);
}
else
{
self = [self initWithData: d];
}
return self;
}
- (id) initWithData: (NSData*)data
{
_handler = [NSXMLSAXHandler new];
[myHandler _setOwner: self];
_parser = [[GSXMLParser alloc] initWithSAXHandler: myHandler withData: data];
return self;
}
- (BOOL) parse
{
BOOL result;
result = [[myHandler parser] parse];
return result;
}
- (NSError*) parserError
{
return nil; // FIXME
}
- (void) setDelegate: (id)delegate
{
myHandler->_delegate = delegate;
}
- (void) setShouldProcessNamespaces: (BOOL)aFlag
{
myHandler->_shouldProcessNamespaces = aFlag;
}
- (void) setShouldReportNamespacePrefixes: (BOOL)aFlag
{
myHandler->_shouldReportNamespacePrefixes = aFlag;
}
- (void) setShouldResolveExternalEntities: (BOOL)aFlag
{
myHandler->_shouldResolveExternalEntities = aFlag;
}
- (BOOL) shouldProcessNamespaces
{
return myHandler->_shouldProcessNamespaces;
}
- (BOOL) shouldReportNamespacePrefixes
{
return myHandler->_shouldReportNamespacePrefixes;
}
- (BOOL) shouldResolveExternalEntities
{
return myHandler->_shouldResolveExternalEntities;
}
@end
@implementation NSXMLParser (NSXMLParserLocatorAdditions)
- (int) columnNumber
{
return [myParser columnNumber];
}
- (int) lineNumber
{
return [myParser lineNumber];
}
- (NSString*) publicID
{
return [myParser publicID];
}
- (NSString*) systemID
{
return [myParser systemID];
}
@end
@implementation NSObject (NSXMLParserDelegateEventAdditions)
- (NSData*) parser: (NSXMLParser*)aParser
resolveExternalEntityName: (NSString*)aName
systemID: (NSString*)aSystemID
{
return nil;
}
- (void) parser: (NSXMLParser*)aParser
didEndElement: (NSString*)anElementName
namespaceURI: (NSString*)aNamespaceURI
qualifiedName: (NSString*)aQualifierName
{
}
- (void) parser: (NSXMLParser*)aParser
didEndMappingPrefix: (NSString*)aPrefix
{
}
- (void) parser: (NSXMLParser*)aParser
didStartElement: (NSString*)anElementName
namespaceURI: (NSString*)aNamespaceURI
qualifiedName: (NSString*)aQualifierName
attributes: (NSDictionary*)anAttributeDict
{
}
- (void) parser: (NSXMLParser*)aParser
didStartMappingPrefix: (NSString*)aPrefix
toURI: (NSString*)aNamespaceURI
{
}
- (void) parser: (NSXMLParser*)aParser
foundAttributeDeclarationWithName: (NSString*)anAttributeName
forElement: (NSString*)anElementName
type: (NSString*)aType
defaultValue: (NSString*)aDefaultValue
{
}
- (void) parser: (NSXMLParser*)aParser
foundCDATA: (NSData*)aBlock
{
}
- (void) parser: (NSXMLParser*)aParser
foundCharacters: (NSString*)aString
{
}
- (void) parser: (NSXMLParser*)aParser
foundComment: (NSString*)aComment
{
}
- (void) parser: (NSXMLParser*)aParser
foundElementDeclarationWithName: (NSString*)anElementName
model: (NSString*)aModel
{
}
- (void) parser: (NSXMLParser*)aParser
foundExternalEntityDeclarationWithName: (NSString*)aName
publicID: (NSString*)aPublicID
systemID: (NSString*)aSystemID
{
}
- (void) parser: (NSXMLParser*)aParser
foundIgnorableWhitespace: (NSString*)aWhitespaceString
{
}
- (void) parser: (NSXMLParser*)aParser
foundInternalEntityDeclarationWithName: (NSString*)aName
value: (NSString*)aValue
{
}
- (void) parser: (NSXMLParser*)aParser
foundNotationDeclarationWithName: (NSString*)aName
publicID: (NSString*)aPublicID
systemID: (NSString*)aSystemID
{
}
- (void) parser: (NSXMLParser*)aParser
foundProcessingInstructionWithTarget: (NSString*)aTarget
data: (NSString*)aData
{
}
- (void) parser: (NSXMLParser*)aParser
foundUnparsedEntityDeclarationWithName: (NSString*)aName
publicID: (NSString*)aPublicID
systemID: (NSString*)aSystemID
notationName: (NSString*)aNotationName
{
}
- (void) parser: (NSXMLParser*)aParser
parseErrorOccurred: (NSError*)anError
{
}
- (void) parser: (NSXMLParser*)aParser
validationErrorOccurred: (NSError*)anError
{
}
- (void) parserDidEndDocument: (NSXMLParser*)aParser
{
}
- (void) parserDidStartDocument: (NSXMLParser*)aParser
{
}
@end

View file

@ -63,6 +63,7 @@ CHECKABLE_TOOLS = \
nstask \
nstimer \
nstimezone \
nsxmlparser \
release \
string \
thread \
@ -119,6 +120,7 @@ nsset_OBJC_FILES = nsset.m
nstask_OBJC_FILES = nstask.m
nstimer_OBJC_FILES = nstimer.m
nstimezone_OBJC_FILES = nstimezone.m
nsxmlparser_OBJC_FILES = nsxmlparser.m
prepend_OBJC_FILES = prepend.m
release_OBJC_FILES = release.m
string_OBJC_FILES = string.m

121
Testing/nsxmlparser.m Normal file
View file

@ -0,0 +1,121 @@
#include <Foundation/Foundation.h>
@interface MyDelegate : NSObject
{
BOOL problem;
unsigned startDoc;
unsigned endDoc;
unsigned startElem;
unsigned endElem;
}
- (BOOL) check;
@end
@implementation MyDelegate
- (BOOL) check
{
if (startDoc != 1)
{
problem = YES;
NSLog(@"Missing start doc");
}
if (endDoc != 1)
{
problem = YES;
NSLog(@"Missing end doc");
}
if (startElem != 1)
{
problem = YES;
NSLog(@"Missing start element");
}
if (endElem != 1)
{
problem = YES;
NSLog(@"Missing end element");
}
return problem;
}
- (void) parserDidEndDocument: (NSXMLParser*)aParser
{
endDoc++;
}
- (void) parserDidStartDocument: (NSXMLParser*)aParser
{
startDoc++;
}
- (void) parser: (NSXMLParser*)aParser
didStartElement: (NSString*)anElementName
namespaceURI: (NSString*)aNamespaceURI
qualifiedName: (NSString*)aQualifierName
attributes: (NSDictionary*)anAttributeDict
{
if (startElem == 0)
{
startElem++;
if ([anElementName isEqual: @"example"] == NO)
NSLog(@"Bad start element '%@' in namespace '%@' '%@' attributes '%@'",
anElementName, aNamespaceURI, aQualifierName, anAttributeDict);
}
else
{
NSLog(@"Extra start element '%@' in namespace '%@' '%@' attributes '%@'",
anElementName, aNamespaceURI, aQualifierName, anAttributeDict);
}
}
- (void) parser: (NSXMLParser*)aParser
didEndElement: (NSString*)anElementName
namespaceURI: (NSString*)aNamespaceURI
qualifiedName: (NSString*)aQualifierName
{
if (endElem == 0)
{
endElem++;
if ([anElementName isEqual: @"example"] == NO)
NSLog(@"Bad end element '%@' in namespace '%@' '%@'",
anElementName, aNamespaceURI, aQualifierName);
}
else
{
NSLog(@"Extra end element '%@' in namespace '%@' '%@'",
anElementName, aNamespaceURI, aQualifierName);
}
}
@end
int main ()
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSData *document;
MyDelegate *delegate;
NSXMLParser *parser;
const char *str =
"<?xml version=\"1.0\"?>"
"<example>"
"</example>";
document = [NSData dataWithBytes: str length: strlen(str)];
parser = [[NSXMLParser alloc] initWithData: document];
delegate = [MyDelegate new];
[parser setDelegate: delegate];
[parser setShouldProcessNamespaces: YES];
if ([parser parse] == NO)
{
NSLog(@"Failed to parse example document");
}
else if ([delegate check] == NO)
{
NSLog(@"All correct.");
}
[parser release];
[pool release];
return 0;
}