当我在iPhone上使用NSXMLParser解析XML时,我有一个奇怪的问题.启动应用程序时,我想预先加载4个表视图,这些视图在后台由RSS-Feeds填充.
当我逐个启动表视图时,而不是加载,解析和显示所有的工作,如魅力.但是当我尝试一次(同时)初始化所有视图时,看起来XML-parser-instances互相干扰.不知何故,来自一个XML-Feed的数据被"广播"到其他不属于的xml-parser实例中.示例:有一个"团队成员"项目,"这是我的名字".当这个错误发生时,添加了另一个xml-feed的字符串,即导致:"这是我的名字58",其中58是来自另一个视图的图表位置.在另一个例子中,"58"似乎错过了.
在我看来,由于NSXMLParser委托方法,这个错误发生了:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentStringValue) {
currentStringValue = [[NSMutableString alloc] initWithCapacity:50];
}
[currentStringValue appendString:string];
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,"通过巧合"字节被附加到不属于它们的字符串.
奇怪的是,NSXMLParser的每个实例都是唯一的,有自己独特的委托,附加到自己的ViewController.每个解析请求产生它自己的后台任务,它有自己的(也是唯一命名的)自动释放池.
我在ViewController中调用NSXMLParser:
// prepare XML saving and parsing
currentStringValue = [[[NSMutableString alloc] initWithCapacity:50] retain];
charts = [[NSMutableArray alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"http://(SOME XML URL)"];
xmlParser = [[[NSXMLParser alloc] initWithContentsOfURL:url] retain];
//Set delegate
[xmlParser setDelegate:self];
//loading indicator
progressWheel = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(150.0,170.0,20.0,20.0)] autorelease];
progressWheel.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
[self.view addSubview:progressWheel];
[progressWheel startAnimating];
// start loading and …
Run Code Online (Sandbox Code Playgroud) 我有一个关于nsxmlparser的简单问题.
这是我的片段
- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string{
[...]
if ([currentElement isEqualToString:@"openpos"]) {
if ([string isEqualToString:@"0"]) {
// I WOULD EXIT FROM LOOP HERE!
return;
}
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
为什么这种回归不起作用?
我需要退出解析器方法并返回我的类错误!
我需要强制例外吗?或者有更好的方法来破解解析器循环?
谢谢,
阿尔贝托
这是我的字符串..如何在java中使用reg exp删除空格
08h03 Data1 Data2 Data3 Data4 5
Run Code Online (Sandbox Code Playgroud)
有没有办法我已经尝试过替换("","");
我在应用程序委托中声明了1个数组
@property(strong,nonatomic)NSMutableArray *books;
Run Code Online (Sandbox Code Playgroud)
我在XMLParser.m中向此数组添加了对象
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"Books"])
return;
NSLog(@"i m in didEndElement");
if([elementName isEqualToString:@"Book"]) {
[appDelegate.books addObject:aBook]; //here i have added objects to array
[aBook release];
aBook = nil;
NSLog(@"books=%@",appDelegate.books);
}
else
[aBook setValue:currentElementValue forKey:elementName];
[currentElementValue release];
currentElementValue = nil;
}
Run Code Online (Sandbox Code Playgroud)
我已经在XMLParser.h中声明了这个数组
@interface XMLParser : NSObject {
NSMutableString *currentElementValue;
AppDelegate *appDelegate;
Book *aBook;
}
Run Code Online (Sandbox Code Playgroud)
现在我必须在BooksDetailViewController.m中访问此数组,如何访问此数组.简而言之,我如何从应用程序委托访问数组到BooksDetailViewController
这是我的XML:
<?xml version="1.0" encoding="UTF-8"?>
<Tests>
<Test case="1">
<str>200000</str>
</Test>
<Test case="2">
<str>200thousand</str>
</Test>
<Test case="3">
<str>?20?</str>
</Test>
<Test case="4">
<str>20?</str>
</Test>
</Tests>
Run Code Online (Sandbox Code Playgroud)
这是解析器的一部分,这是非常标准的,因为我在大多数教程中都找到了它:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:string];
else
currentElementValue =
(NSMutableString *) [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
Run Code Online (Sandbox Code Playgroud)
然后我使用这一行将每个currentElementValue解析为testObj的每个变量
[testObj setValue:currentElementValue forKey:elementName];
Run Code Online (Sandbox Code Playgroud)
代码成功地将XML解析为testObj.然而,问题是在情况4中,"20"消失了.即一旦元素以数字开头,然后跟随汉字,数字就会消失.
此外,如果我使用:
[currentElementValue appendString:string];
Run Code Online (Sandbox Code Playgroud)
代替:
currentElementValue =
(NSMutableString *) [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Run Code Online (Sandbox Code Playgroud)
元素可以显示所有字符,但以许多空格开头.
我想弄清楚为什么数字消失了,并寻找解决方案来显示没有空格领先的所有字符.
提前感谢您提供的任何帮助!
问题:这个过程与iOS6完美配合.现在它不会提取最新信息并替换显示的数据.因此,应用程序信息总是错误的.如果我重置模拟器上的内容,它可以在当前时间段内工作.之后我将需要重新设置内容.有什么建议.我已经包含了处理我所有数据处理的3个文件以供参考.
Reader.M
- (void) startRequest
{
NSURL *url = [[NSURL alloc] initWithString:@"http://www.something.com/app/rss/"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:60.0f];
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES];
if(conn)
{
_receivedData = [[NSMutableData alloc]init];
}
}
#pragma mark - NSURLConnectionDataDelegate
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%@",error.description);
}
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"received %d bytes",data.length);
[_receivedData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:_receivedData];
JSTRRSSParser *rssParser = [[JSTRRSSParser alloc] init];
parser.delegate = rssParser; …
Run Code Online (Sandbox Code Playgroud) 我的iOS应用程序解析从远程服务器获取的xml(我不能以任何方式影响).当它遇到如下所示的xml标记时:
<tag a="x" b="y" c="z">
this is a
<aabb/>
content
<ccdd/>
string
</tag>
Run Code Online (Sandbox Code Playgroud)
它只解析内容的第一部分("这是一个"),而忽略了这些单个标记之后的所有内容.无论这些单个标签中有多少个跟随,如果它只有一个标签,它也会跳过其余标签.我没有真正得到这种行为,是否有解释或方法来克服这个问题?
nsxmlparser ×7
ios ×3
iphone ×3
objective-c ×3
background ×1
cocoa-touch ×1
java ×1
nsdictionary ×1
nsstring ×1
regex ×1
xml-parsing ×1