【问题标题】:cant retrieve xml values using NSXMLParser无法使用 NSXMLParser 检索 xml 值
【发布时间】:2012-09-10 09:47:35
【问题描述】:

我在 xml 中的 php 响应就是这种类型

<users>
<username>myemail</username>
<password>mypass</password>
 </users>

现在这是我的 parseUrl 类

  NSURL *parserUrl = [[[NSURL alloc] initWithString:urlString] autorelease];
        NSXMLParser *parser = [[[NSXMLParser alloc] initWithContentsOfURL:parserUrl] autorelease];
        [parser setDelegate:self];



- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {



    if ( [elementName isEqualToString:@"users"]) 
    {
        return;
    }



    if ( [elementName isEqualToString:@"username"] ) 
    {
        NSString *val = [attributeDict  objectForKey:@"username"] ;    
      return;
    }

}

现在的问题是,attributeDict 给出了 0 对。该函数正在读取username, password and users,这意味着它可以进入这个循环

   if ( [elementName isEqualToString:@"username"] ) 
        {
            NSString *val = [attributeDict  objectForKey:@"username"] ;    
          return;
        }

但是我怎样才能检索到这个节点的值呢?

【问题讨论】:

标签: php iphone objective-c cocoa-touch xml-parsing


【解决方案1】:

删除return声明

attributeDict 总是包含属性。

例如

这里的 'id' 是用户的属性。

要获取字符串值,你需要写

//take string variable in header file 'elementname'

NSString *elementname;

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

elementname = elementName;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    elementname = elementName;
}


-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

   if([elementname isEqualToString:@"username"])
   {
       NSLog(@"username : %@",string);
   }
   else if([elementname isEqualToString:@"password"])
   {
       NSLog(@"password : %@",string);
   }
}

【讨论】:

  • 伙伴你能通过编辑我的代码来解释吗?你指出的函数在 NSLog 中返回了我的值,但是我怎么知道它的用户名是否是密码字符串。请举一个例子来存储这些值的类型
  • 只有一件事,当我运行它时。它重复了两次。首先它显示用户名:xxxx,然后下一次显示用户名:(没有)与密码相同。这是某种错误还是应该是那样的?
  • 试试这个,但我不确定。我有问题,但我解决了我只是不记得的问题。 [解析器 setShouldResolveExternalEntities:YES];是/否。
【解决方案2】:

试试这个

-(void) parserDidStartDocument:(NSXMLParser *)parser
{
    list = [[NSMutableArray alloc] init];
    resultArray = [[NSMutableArray alloc] init];
    currentElementValue = [[NSMutableString alloc] init];
}
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
{
currentElementName = [elementName copy];

if([elementName isEqualToString:@"username"])
{
    list = [[NSMutableArray alloc] init];
}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{
if([elementName isEqualToString:@"username"])
{
    [resultArray addObject: currentElementValue];
}
}

-(void) parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"Result Array= %@",resultArray);
NSLog(@"list Array= %@",list);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多