为iPhone编程.
使用NSXMLParser解析时,是否下载整个.xml然后解析,还是执行"流式"解析?基本上如果我中途解析解析,我可以节省带宽,还是只是cpu周期?
我有一个带有UISearchBar的书籍应用程序,用户可以在其中键入任何书名并在下面输入搜索结果(来自ext API调用).
我在我的应用程序中使用了一个名为retrieveArray的单例变量,它存储了所有书籍.
@interface Shared : NSObject {
NSMutableArray *books;
}
@property (nonatomic, retain) NSMutableArray *books;
+ (id)sharedManager;
@end
Run Code Online (Sandbox Code Playgroud)
使用NSMutableArray*retrieveArray在多个.m文件中访问它; ...在头文件中
retrievedArray = [[Shared sharedManager] books];
Run Code Online (Sandbox Code Playgroud)
我的问题是如何确保retrieveArray中的值在所有类中保持同步.
实际上,retrieveArray中的值通过NSXMLParser(即通过外部Web服务API)添加.有一个单独的XMLParser.m文件,我在那里进行所有解析并填充数组.解析在单独的线程上完成.
- (void) run: (id) param {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: [self URL]];
[parser setDelegate: self];
[parser parse];
[parser release];
NSString *tmpURLStr = [[self URL]absoluteString];
NSRange range_srch_book = [tmpURLStr rangeOfString:@"v1/books"];
if (range_srch_book.location != NSNotFound)
[delegate performSelectorOnMainThread:@selector(parseDidComplete_srch_book) withObject:nil waitUntilDone:YES];
[pool release];
}
- (void) parseXMLFile: (NSURL …Run Code Online (Sandbox Code Playgroud) 我已经阅读了很多关于如何从xml文件中获取文本的示例,但只是不知道如何.这是一个示例xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<questions>
<set>
<question>Question</question>
<answer>Answer</answer>
</set>
</questions>
Run Code Online (Sandbox Code Playgroud)
用-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI,有什么获得的值最简单的方法Question和Answer?我已经把我的解析器委托连接起来了.
我正在使用NSXmlParser来解析rss feed.到目前为止一切运作良好.
我预计rss feed最终会包含几十个/几百个帖子.我目前的解决方案是读取整个RSS Feed并显示结果.但是我想只阅读前十个帖子(以防止它解析可能有数百个项目).然后在稍后的时间(例如当用户到达表的末尾时)来解析接下来的十个帖子.
所以我的问题是如何解析前十个帖子,然后解析接下来的十个帖子,然后解析接下来的十个帖子等等......
这是我用来获取所有帖子的内容:
- (void)parseXMLFileAtURL:(NSString *)URL
{
myArray = [[NSMutableArray alloc] init];
//convert the path to a proper NSURL or it won't work
NSURL *xmlURL = [NSURL URLWithString:URL];
rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
[rssParser setDelegate:self];
[rssParser parse];
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
//error
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
currentElement = [elementName copy];
if ([elementName isEqualToString:@"item"]) {
//clear out our story item caches...
item = [[NSMutableDictionary alloc] init]; …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个UISearchbar.这是一个动态搜索,当用户输入文本时,通过远程API调用(我认为是通过REST)搜索远程数据库.
当用户键入时,表视图会动态刷新.我正在使用NSXMLParser来解析XML结果.(所以3个委托方法; didStartElement,didEndElement)
在某些情况下,结果中显示重复的条目,例如,如果用户键入了YAH,则显示YAHOO 3-4次.我不知道为什么.
如何减少解析完成的次数,或者如何延迟解析,以便它不会对用户输入/删除的每个字符发出请求.
我假设,这可能会解决问题.
我目前正在解析一些看起来像这样的xml
<Rows>
<Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/>
<Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/>
</Rows>
Run Code Online (Sandbox Code Playgroud)
我解析它,以便有一个字典数组(每个字典都有行的四个值).
然后我将ManufacturerName传递给我的startSortingTheArray方法
if (dataSetToParse == @"ICMfg") // ICMfg is a string passed to this view from the parent view cell selection enabling me to pass different data sets to this view
{
//Filter results (ISAUTO = T)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ISAUTO",@"T"];
NSArray *filteredArray = [myDataArray filteredArrayUsingPredicate:predicate];
//Passes Manufacturer strigs over to startSortingtheArray method
[self startSortingTheArray:[filteredArray valueForKey:@"MANUFACTURER"]];
}
Run Code Online (Sandbox Code Playgroud)
因此,从这里将所有ManufacturerNames作为字符串数组发送到我的方法.然后我使用这个数组来设置我的所有section/index-scroller.下面的方法显示了我是如何做到这一点的.
//method to sort array and split …Run Code Online (Sandbox Code Playgroud) 我正在处理的基本问题是使用NSStream类来解析传入的增量XML数据.数据永远不是一个完整的XML文档,但我希望根据套接字可以读取的内容以增量块的形式接收和处理它.
看一下文档NSXMLParser,似乎initWithStream:初始化a 的方法NSXMLParser将是我问题的完美解决方案.我可以使用a初始化解析器,NSInputStream然后在我通过套接字接收数据时调用该parse方法,然后NSXMLParser应该调用NSXMLParser委托.
但是,我没有看到任何被调用的委托,我看到被调用的唯一方法是流委托stream:handleEvent:.Apple或其他开发人员似乎很少或没有此API的示例.关于我做错了什么或如何initWithStream:正确使用的任何想法?
ContentParser.h
@interface ContentParser : NSObject <NSStreamDelegate,
NSXMLParserDelegate>
{
NSInputStream *inputStream;
NSOutputStream *outputStream;
NSMutableData *receivedData;
NSXMLParser *xmlParser;
}
- (void)initStream;
Run Code Online (Sandbox Code Playgroud)
ContentParser.m
@implementation ContentParser
- (void)initStream
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef)@"<hostname>",
<port>,
&readStream,
&writeStream);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
inputStream.delegate = self;
outputStream.delegate = self;
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop …Run Code Online (Sandbox Code Playgroud) 当我appDelegate按如下方式声明接口以进行设置时NSXMLParserDelegate,我从其他使用[[UIApplication sharedApplication]委托]的视图中收到一些警告;
@interface AppDelegate : UIResponder <UIApplicationDelegate, NSXMLParserDelegate>
Run Code Online (Sandbox Code Playgroud)
警告:使用不兼容类型"id"的表达式初始化"AppDelegate*__ strong"
但是,如果我删除它,由于xmlParser的自设置,会出现另一个警告,
@interface AppDelegate : UIResponder <UIApplicationDelegate>
Run Code Online (Sandbox Code Playgroud)
警告:将'AppDelegate*const __strong'发送到不兼容类型'id'的参数
上
xmlParser = [[NSXMLParser alloc] initWithData:receivedData];
[xmlParser setDelegate:self];
Run Code Online (Sandbox Code Playgroud)
如何删除?谢谢
我之前做了很多次,但现在失败了.我想访问我的应用程序中提供的文件.
NSString* path = [[NSBundle mainBundle] pathForResource:@"information" ofType:@"xml"];
Run Code Online (Sandbox Code Playgroud)
回报
/Users/eldude/Library/Application Support/iPhone Simulator/7.0.3/Applications/5969FF96-7023-4859-90C0-D4D03D25998D/App.app/information.xml
Run Code Online (Sandbox Code Playgroud)
这是正确的 - 在终端和所有这些检查.但是,尝试解析路径失败
NSURL* fileURL = [NSURL URLWithString:path];
NSXMLParser *nsXmlParser = [[NSXMLParser alloc] initWithContentsOfURL:fileURL];
[nsXmlParser setDelegate:self];
if(![nsXmlParser parse]){
NSError* e = nsXmlParser.parserError;
NSLog(@"ERROR parsing XML file: \n %@",e);
self = NULL;
}
Run Code Online (Sandbox Code Playgroud)
同
Error Domain=NSCocoaErrorDomain Code=-1 "The operation couldn’t be completed. (Cocoa error -1.)" UserInfo=0xb9256f0 {NSXMLParserErrorMessage=Could not open data stream}
Run Code Online (Sandbox Code Playgroud)
想法有人吗?
我正在使用NSXMLParser解析一些HTML,并且只要遇到&符号就会遇到解析器错误.在解析它之前我可以过滤出&符号,但我宁愿解析那里的所有内容.
它给了我错误68,NSXMLParserNAMERequiredError:名称是必需的.
我最好的猜测是它是一个字符集问题.我对字符集的世界有点模糊,所以我认为我的无知正在咬我的屁股.源HTML使用charset iso-8859-1,所以我使用此代码初始化Parser:
NSString *dataString = [[[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding] autorelease];
NSData *dataEncoded = [[dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES] autorelease];
NSXMLParser *theParser = [[NSXMLParser alloc] initWithData:dataEncoded];
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
nsxmlparser ×10
iphone ×6
objective-c ×6
ios ×5
cocoa ×2
cocoa-touch ×2
uisearchbar ×2
xcode ×2
ios7 ×1
nsstream ×1
nsxml ×1
rss ×1
swift ×1
uitableview ×1
xml ×1
xml-parsing ×1