解析XML数据或转换为NSDictionary?

问题描述:

我有从服务器检索到的XML数据,我需要删除它的一些部分,以设置我的tableview。我将这些数据转换为NSDictionary,但是我认为解析(这是正确的词?)xml数据可能更容易,而不是在它已经转换后进行混淆。这里是一个xml数据的例子。解析XML数据或转换为NSDictionary?

<?xml version="1.0" encoding="UTF-8"?> 
<response status="ok"> 
<rosters records_per_page="50" page_count="1" page="1" total_record_count="11"> 
<roster class_id="685343" role="T" user_id="968428" roster_id="16257539"> 
<class name="Haiku API Keys" shortname="haiku_api" end_date="2011-12-20" code=""  
import_id="" id="685343" description="" teacher_id="971456" year="2012" 
organization_id="134146" active="false"/> 
</roster> 
<roster class_id="512296" role="S" user_id="968428" roster_id="10456326"> 
<class name="Physics AP" shortname="physics-ap_0406-01" end_date="2012-05-02" 
code="PHYSICSA_0406-01" import_id="0406-01-2012" id="512296" description="DESCRIPTION" 
teacher_id="968968" year="2012" organization_id="134148" active="true"/> 
</roster> 

我想要做的是删除对象“false”的数据,对于“激活”键。这将使我的物理AP的类名称的数据。这可能与XML数据做,或者我应该尝试删除这些数据一旦它是一个NSDictionary?这是转换后的NSDictionary的样子。

XML数据进行格式化
(
{ 
response =  { 
    "@status" = ok; 
    rosters =   { 
     "@page" = 1; 
     "@page_count" = 1; 
     "@records_per_page" = 50; 
     "@total_record_count" = 11; 
     roster =    (
          { 
       "@class_id" = 685343; 
       "@role" = T; 
       "@roster_id" = 16257539; 
       "@user_id" = 968428; 
       class =      { 
        "@active" = false; 
        "@code" = ""; 
        "@description" = ""; 
        "@end_date" = "2011-12-20"; 
        "@id" = 685343; 
        "@import_id" = ""; 
        "@name" = "Haiku API Keys"; 
        "@organization_id" = 134146; 
        "@shortname" = "haiku_api"; 
        "@teacher_id" = 971456; 
        "@year" = 2012; 
       }; 
      }, 
          { 
       "@class_id" = 512296; 
       "@role" = S; 
       "@roster_id" = 10456326; 
       "@user_id" = 968428; 
       class =      { 
        "@active" = true; 
        "@code" = "PHYSICSA_0406-01"; 
        "@description" = "DESCRIPTION"; 
        "@end_date" = "2012-05-02"; 
        "@id" = 512296; 
        "@import_id" = "0406-01-2012"; 
        "@name" = "Physics AP"; 
        "@organization_id" = 134148; 
        "@shortname" = "physics-ap_0406-01"; 
        "@teacher_id" = 968968; 
        "@year" = 2012; 
       }; 
      }, 
      } 

就用这种方式让我觉得它会更容易通过解析它来完成,但我不知道这是否是可能的,或者用了什么方法。如果您有办法通过使用xml数据或NSDictionary来完成此任务,我很乐意听到它。谢谢你的帮助。

我使用了你用过的相同的XMLReader,而且我喜欢它。

如果我是来解决问题,这是我的解决方案,你有你只需要创建词典的新数组字典后,具体名单的新数组,像这样:

NSArray *roster = [[[theDictionary objectForKey:@"response"] objectForKey:@"rosters"] objectForKey:@"roster"]; 

NSMutableArray *newRoster = [[NSMutableArray alloc] init]; 

for(int i=0;i<[roster count];i++){ 
    NSDictionary *aRoster = [roster objectAtIndex:i]; 
    //filter the array and add it to the mutable array 
    if([[[aRoster objectForKey:@"class"] objectForKey:@"@@active"] isEqualToString:@"true"]) 
    { 
     //this way we only add those data whose active is "true" 
     [newRoster addObject:aRoster]; 
    } 
} 

//do what you want with the new roster 
NSLog(@"newRoster = %@",newRoster); 

在这种情况下,我只是假设你只打算使用“roster”标签数组,而你想删除那些“active”属性等于字符串“false”的标签。

当你完成它时,不要忘记发布newRoster。

XMLReader可以是相当繁琐的,当涉及到属性的工作,纠正我,如果我有一些错误,因为我没有MAC今天使用

+0

你好,欢迎来到*!下一次,在发布之前,请查看关于语法和代码格式指南的常见问题解答,因为在*中我们赞赏并期待这些指导。 –

+0

谢谢,为我工作 – davis

如果你是新来的xml解析在目标c我建议你使用TBXML(http://tbxml.co.uk/)库..解析你的xml使用这个库,并存储你想要在数组中的什么内容或字典(留下你不想要的)..并使用数组或字典来创建你的表..

+0

我已经使用的XMLReader是https:// github上。 COM /插入 - 机智名称/ XML到NSDictionary中。 TBXML会完成我想要做的事情吗?我只是不知道如何在活动对象为“true”的情况下添加标题对象。这两个键在同一个词典中,但我不知道一种方法,可以让我查看“活动”对象,并在活动对象为“false”时消除“标题”对象。我希望这是有道理的。 – davis

+0

是的,用tbxml你可以检查你正在查找的状况,只能解析或存储你需要的内容 – Saurabh