Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Extend OFXMLElementBuilderDelegate. |
|---|---|
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
976f115da99fe161bf81d8a00b3991c8 |
| User & Date: | js 2010-12-20 15:55:56.000 |
Context
|
2010-12-20
| ||
| 17:42 | Add -fobjc-exceptions to objfw-config. check-in: c5937c3e79 user: js tags: trunk | |
| 15:55 | Extend OFXMLElementBuilderDelegate. check-in: 976f115da9 user: js tags: trunk | |
| 15:51 | OFXMLParser: Allow comments after the document root. check-in: f40092db22 user: js tags: trunk | |
Changes
Changes to src/OFXMLElementBuilder.h.
| ︙ | ︙ | |||
28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
* with all children.
*
* \param builder The builder which built an OFXMLElement
* \param elem The OFXMLElement the OFXMLElementBuilder built
*/
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didBuildElement: (OFXMLElement*)elem;
@end
/**
* \brief A class implementing the OFXMLParserDelegate protocol that can build
* OFXMLElements from the document parsed by the OFXMLParser.
*
* It can also be used to build OFXMLElements from parts of the document by
| > > > > > > > > > > > > > > > > > > > > > > > | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
* with all children.
*
* \param builder The builder which built an OFXMLElement
* \param elem The OFXMLElement the OFXMLElementBuilder built
*/
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didBuildElement: (OFXMLElement*)elem;
/**
* This callback is called when the OFXMLElementBuilder gets a close tag which
* does not belong there.
*
* Most likely, the OFXMLElementBuilder was used to build XML only of a child
* of the root element and the root element was closed. Often the delegate is
* set to the OFXMLElementBuilder when a certain element is found, this can be
* used then to set the delegate back after that certain element has been
* closed.
*
* If this method is not implemented in the delegate, the default is to throw
* an OFMalformedXMLException.
*
* \param builder The builder which did not expect the close tag
* \param name The name of the close tag
* \param prefix The prefix of the close tag
* \param ns The namespace of the close tag
*/
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didNotExpectCloseTag: (OFString*)name
withPrefix: (OFString*)prefix
namespace: (OFString*)ns;
@end
/**
* \brief A class implementing the OFXMLParserDelegate protocol that can build
* OFXMLElements from the document parsed by the OFXMLParser.
*
* It can also be used to build OFXMLElements from parts of the document by
|
| ︙ | ︙ | |||
65 66 67 68 69 70 71 | /** * Sets the delegate for the OFXMLElementBuilder. * * \param delegate The delegate for the OFXMLElementBuilder */ - (void)setDelegate: (id <OFXMLElementBuilderDelegate>)delegate; @end | > > > | 88 89 90 91 92 93 94 95 96 97 | /** * Sets the delegate for the OFXMLElementBuilder. * * \param delegate The delegate for the OFXMLElementBuilder */ - (void)setDelegate: (id <OFXMLElementBuilderDelegate>)delegate; @end @interface OFObject (OFXMLElementBuilderDelegate) <OFXMLElementBuilderDelegate> @end |
Changes to src/OFXMLElementBuilder.m.
| ︙ | ︙ | |||
12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include "config.h"
#import "OFXMLElementBuilder.h"
#import "OFXMLElement.h"
#import "OFXMLParser.h"
#import "OFMutableArray.h"
#import "OFAutoreleasePool.h"
@implementation OFXMLElementBuilder
+ elementBuilder
{
return [[[self alloc] init] autorelease];
}
| > | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include "config.h"
#import "OFXMLElementBuilder.h"
#import "OFXMLElement.h"
#import "OFXMLParser.h"
#import "OFMutableArray.h"
#import "OFAutoreleasePool.h"
#import "OFExceptions.h"
@implementation OFXMLElementBuilder
+ elementBuilder
{
return [[[self alloc] init] autorelease];
}
|
| ︙ | ︙ | |||
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
}
- (void)parser: (OFXMLParser*)parser
didEndElement: (OFString*)name
withPrefix: (OFString*)prefix
namespace: (OFString*)ns
{
if ([stack count] == 1)
[delegate elementBuilder: self
didBuildElement: [stack firstObject]];
[stack removeNObjects: 1];
}
- (void)parser: (OFXMLParser*)parser
foundCharacters: (OFString*)str
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
| > > > > > > > > > > > > > > | | > > > > > > | > | > > > > | > > > > > > > > > > > > > > > | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
}
- (void)parser: (OFXMLParser*)parser
didEndElement: (OFString*)name
withPrefix: (OFString*)prefix
namespace: (OFString*)ns
{
if ([stack count] == 0) {
[delegate elementBuilder: self
didNotExpectCloseTag: name
withPrefix: prefix
namespace: ns];
return;
}
if ([stack count] == 1)
[delegate elementBuilder: self
didBuildElement: [stack firstObject]];
[stack removeNObjects: 1];
}
- (void)parser: (OFXMLParser*)parser
foundCharacters: (OFString*)str
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFXMLElement *elem = [OFXMLElement elementWithCharacters: str];
if ([stack count] == 0)
[delegate elementBuilder: self
didBuildElement: elem];
else
[[stack lastObject] addChild: elem];
[pool release];
}
- (void)parser: (OFXMLParser*)parser
foundCDATA: (OFString*)cdata
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFXMLElement *elem = [OFXMLElement elementWithCDATA: cdata];
if ([stack count] == 0)
[delegate elementBuilder: self
didBuildElement: elem];
else
[[stack lastObject] addChild: elem];
[pool release];
}
- (void)parser: (OFXMLParser*)parser
foundComment: (OFString*)comment
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFXMLElement *elem = [OFXMLElement elementWithComment: comment];
if ([stack count] == 0)
[delegate elementBuilder: self
didBuildElement: elem];
else
[[stack lastObject] addChild: elem];
[pool release];
}
@end
@implementation OFObject (OFXMLElementBuilderDelegate)
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didBuildElement: (OFXMLElement*)elem
{
}
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didNotExpectCloseTag: (OFString*)name
withPrefix: (OFString*)prefix
namespace: (OFString*)ns
{
@throw [OFMalformedXMLException newWithClass: [builder class]];
}
@end
|
Changes to tests/OFXMLElementBuilderTests.m.
| ︙ | ︙ | |||
17 18 19 20 21 22 23 | #import "OFXMLParser.h" #import "OFXMLElementBuilder.h" #import "OFAutoreleasePool.h" #import "TestsAppDelegate.h" static OFString *module = @"OFXMLElementBuilder"; | | > | | | | > > | > | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#import "OFXMLParser.h"
#import "OFXMLElementBuilder.h"
#import "OFAutoreleasePool.h"
#import "TestsAppDelegate.h"
static OFString *module = @"OFXMLElementBuilder";
static OFXMLElement *elem[2];
static size_t i = 0;
@implementation TestsAppDelegate (OFXMLElementBuilderTests)
- (void)elementBuilder: (OFXMLElementBuilder*)builder
didBuildElement: (OFXMLElement*)elem_
{
assert(i < 2);
elem[i++] = [elem_ retain];
}
- (void)XMLElementBuilderTests
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFXMLParser *p = [OFXMLParser parser];
OFXMLElementBuilder *builder = [OFXMLElementBuilder elementBuilder];
OFString *str = @"<foo>bar<![CDATA[f<oo]]>baz<qux/>"
" <qux xmlns:qux='urn:qux'><qux:bar/><x qux:y='z'/></qux>"
"</foo>";
[p setDelegate: builder];
[builder setDelegate: self];
TEST(@"Building elements from parsed XML",
R([p parseString: str]) &&
elem[0] != nil && [[elem[0] stringValue] isEqual: str] &&
R([p parseString: @"<!--foo-->"]) &&
elem[1] != nil && [[elem[1] stringValue] isEqual: @"<!--foo-->"])
[elem[0] release];
[elem[1] release];
[pool drain];
}
@end
|