我正在尝试使用NSXMLParser解析xml文件。我的NSXMLParserDelegate实现了parser:didStartElement和parser:didEndElement,它从解析器获取每个元素的消息。但是,当我尝试打印它们时,我发现消息是空的。我遗漏了什么?
我的代表:
@interface ExtensionXML : NSObject <NSXMLParserDelegate> {
@private NSXMLParser* xmlParser;
@private NSURL* fileUrl;
}
- (void) parse;
- (ExtensionXML*) initWithPath: (NSString*)path;
@end
@implementation ExtensionXML
- (ExtensionXML*) initWithPath: (NSString*)path
{
if (self = [super init])
{
fileUrl = [NSURL fileURLWithPath:[path stringByExpandingTildeInPath]]; // error handling
}
return self;
}
- (void) parse
{
xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:fileUrl];
[xmlParser setDelegate:self];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser setShouldProcessNamespaces:YES];
[xmlParser setShouldReportNamespacePrefixes:YES];
[xmlParser parse];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
NSLog(@"start: element %s uri %s qualified name %s", elementName, namespaceURI, qualifiedName);
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
NSLog(@"end: element %s uri %s qualified name %s", elementName, namespaceURI, qualifiedName);
}
@end xml文件是:
<someroot xmlns="http://ns.mycompany.com/product/format/1.3">
<id>myid</id>
<version>1</version>
<components>
<component name="componentOne">
<initializer>Init0</initializer>
</component>
</components>
</someroot>NSLog的输出显示elementName、namespaceURI和qualifiesName都为空。
发布于 2011-03-19 21:52:27
要记录NSStrings,请使用%@而不是%s。更改两个NSLog行。有关说明符及其用法的列表,请参阅String Format Specifiers。
另一个问题是didEndElement委托方法没有attributes参数,因此您编写的方法不会被调用。它应该是:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
{
NSLog(@"end: element %@ uri %@ qualified name %@",
elementName, namespaceURI, qualifiedName);
}发布于 2013-01-29 13:33:58
Try to compare with element name and get the results like the following
if([elementName isEqualToString:@"component"])
{
//print something related to xml data
}
Use %@ instead of %s for printing.https://stackoverflow.com/questions/5362038
复制相似问题