【问题标题】:NSXMLParser - empty valueNSXMLParser - 空值
【发布时间】:2015-07-20 11:48:31
【问题描述】:

我第一次尝试使用 NSXMLParser 从 XML 中获取值。但我有一个问题。

在我的 XML 下方:

<Library>
    <Book>
        <ID>1</ID>
        <TITLE>Test</TITLE>
    </Book>
</Library>

和解析器代码:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString                                 *)   elementName namespaceURI:(NSString *)namespaceURI qualifiedNam(NSString *)qName attributes:(NSDictionary *)attributeDict
{
  if([elementName isEqualToString:@"Book"])
  {
    NSLog(@"%@", [attributeDict valueForKey:@"ID"]);
  }
}

结果 ID 为空。你能帮帮我吗?

【问题讨论】:

  • 我想你已经先把你的书词典拿来了。 :)

标签: ios xml-parsing


【解决方案1】:

不幸的是,NSXMLParser 不能这样工作。它按文档顺序遍历 XML 中的元素,因此当“Book”元素开始时,它还没有到达“ID”元素。如果 XML 看起来像这样,您的代码工作

<Book Id="1">
    ...
</Book>

但我想您无法控制 XML。那么你需要一个更复杂的解决方案。我相信以下方法会起作用:

添加这些实例变量

NSString *currentElement, *bookID, *bookTitle;
NSMutableString *elementValue;

实现以下方法:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString                                 *)   elementName namespaceURI:(NSString *)namespaceURI qualifiedNam(NSString *)qName attributes:(NSDictionary *)attributeDict {
    currentElement = elementName;
    elementValue = nil; 
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    // Append characters to element value
    if (!elementValue) elementValue = [NSMutableString stringWithCapacity:100];
    [elementValue appendString:string];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName {
     if ([@"Id" isEqualToString:elementName]) {
          bookID = [elementValue copy];
     } else if ([@"Title" isEqualToString:elementName]) {
          bookTitle = [elementValue copy];
     } else if ([@"Book" isEqualToString:elementName]) {
          // end of Book element, do something with bookID and bookTitle
     }
}

【讨论】:

  • 好的,谢谢。请问我有办法获取 nsarray 或 nsdictionary 的值吗?
  • 我建议你先解析整个字符串。比根据您的数据结构检索您的图书 ID。是的,有一种“解析”的方法。在你想要的包装器(NSArray 或 NSDictionary)中解析你的字符串。
  • @ankmara 我更新了我的答案以获得一些指导。
  • @HarvantS。我不确定你是什么意思。我们已经在解析字符串了。
  • 非常感谢。有用。请问,如何将 elementvalue(all) 添加到 nsarray,好吗?或迪克。当我使用时: self.titles = [[NSMutableArray alloc] initWithObjects:[self.elementValue copy], nil] 这仅添加最后一个对象。谢谢
【解决方案2】:

按照下面的代码,你会明白的。

在你的 .h 部分

//第一步:添加委托类

     First of all you should add <NSXMLParserDelegate>

//第二步:创建必要的对象

     NSXMLParser *parser;
     NSMutableData *ReceviedData;
     NSMutableString *currentStringValue;

     NSMutableArray *arrayID;

在您的 .m 部分中

 //Step 3 - Allocate your all  Arrays in your viewDidLoad method

     arrayId = [NSMutableArray alloc]init];


 //Step 4 - Create Connection in your viewDidLoad Like 

     [self createConnection:@"http://www.google.com"];//give your valid url.

-(void)createConnection:(NSString *)urlString
{
     NSURL *url = [NSURL URLWithString:urlString];

  //Step 5 - parser delegate methods are using NSURLConnectionDelegate class or not.
    BOOL success;
    if (!parser)
    {
      parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
      parser.delegate = self;
      parser.shouldResolveExternalEntities = YES;
      success = [parser parse];
      NSLog(@"Success : %c",success);
    }
  }

   -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
  {
      NSLog(@"Current Element Name : %@",elementName);

     if ([elementName isEqualToString:@"ID"])
     {
         NSLog(@"The Result is==%@",elementName);
     }

  }

  -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  {
    currentStringValue = [[NSMutableString alloc] initWithString:string];
     NSLog(@"Current String Value : %@",currentStringValue);
  }

  -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
   {
     if ([elementName isEqualToString:@"ID"])
     {
       [arrayResult addObject:currentStringValue];
     }
      currentStringValue = nil;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2011-05-22
    • 2013-11-16
    • 2012-09-10
    • 2012-01-05
    相关资源
    最近更新 更多