2011-03-22 97 views
2

我有一个XML响应,我需要设置到一个数组。问题是我需要访问每个元素并将其存储在一个数组中,以便我可以将它用于tableview。TBXML解析复杂的XML到数组

<?xml version="1.0" encoding="UTF-8"?> 
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schema.2sms.com/2.0/schema/0310_ResponseReportStandard.xsd" Version="1.0"> 
    <Error> 
     <ErrorCode>00</ErrorCode> 
     <ErrorReason>OK</ErrorReason> 
    </Error> 
    <ResponseData> 
     <Identification> 
      <UserID>[email protected]</UserID> 
     </Identification> 
     <Result>2 records were returned</Result> 
     <Detail> 
      <ReportTitle>Message Summary: Today</ReportTitle> 
      <Record> 
       <Destination>447790686158</Destination> 
       <Status>WithNetwork</Status> 
       <GUID><![CDATA[2011-03-22T10:54:22.097Z]]></GUID> 
       <DateSubmitted>2011-03-22T10:54:22.097</DateSubmitted> 
       <DateToSend></DateToSend> 
       <DateSent>2011-03-22T10:54:22.533</DateSent> 
       <DateReceived></DateReceived> 
       <Message><![CDATA[Yet again another test]]></Message> 
       <ID>2011-03-22 10:54:22.250HIHIIOJTFVETW85TS</ID> 
      </Record> 
      <Record> 
       <Destination>447790686158</Destination> 
       <Status>SUCCESS</Status> 
       <GUID><![CDATA[2011-03-22T10:50:40.064Z]]></GUID> 
       <DateSubmitted>2011-03-22T10:50:40.063</DateSubmitted> 
       <DateToSend></DateToSend> 
       <DateSent>2011-03-22T10:50:42.473</DateSent> 
       <DateReceived>2011-03-22T10:50:54.570</DateReceived> 
       <Message><![CDATA[This is a test]]></Message> 
       <ID>2011-03-22 10:50:40.210DRUDVMCEZGETW85TS</ID> 
      </Record> 
      <ReportPage ReportID="775797" ItemsPerPage="25" Page="1" TotalItems="2" /> 
     </Detail> 
    </ResponseData> 
</Response> 

我有TBXML对象初始化但不能工作如何得到任何的重复信息,我知道这将需要某种形式的循环,但我是很新,Objective-C的所以它的证明一个挑战。我需要从xml中获取<destination> , <status>, <datesent>, <message>。可以有多达25条记录....

希望有人能帮助这一直在我的脑海中整天!

回答

6

我做了类似的事情最近,你能很快适应,我的XML是:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<agencies> 
    <agency> 
     <name>Agency 1 name</name> 
     <addressFirstLine>Immeuble XYZ<addressFirstLine> 
     <addressSecondLine>rue de la republique</addressSecondLine> 
     <addressThirdLine>69007 Lyon</addressThirdLine> 
     <telNumber>01 23 45 67 89</telNumber> 
    </agency> 
    <agency> 
     <name>Agency 2 name</name> 
     <addressFirstLine>Immeuble ABC<addressFirstLine> 
     <addressSecondLine>rue de la republique</addressSecondLine> 
     <addressThirdLine>69007 Lyon</addressThirdLine> 
     <telNumber>01 23 45 67 89</telNumber> 
    </agency> 
</agencies> 

的代码我用来分析这一(获得的结果在我的NSArray称为agencies):

TBXML *tbxml = [[TBXML tbxmlWithXMLFile:yourXmlFile retain]; 
    TBXMLElement *rootXMLElement = tbxml.rootXMLElement; 

    if (rootXMLElement) { 
     self.agencies = [self traverseElement:rootXMLElement]; 
     [delegate managerDidReceiveData]; 
    } 

    // release resources 
    [tbxml release]; 

我的功能转换为:

- (NSArray *)traverseElement:(TBXMLElement *)element { 

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

    TBXMLElement *agenciesXmlElement = element->firstChild; 
    TBXMLElement *agencyXmlElement; 

    do { 

     // if the element has child elements, process them 
     if ((agencyXmlElement = agenciesXmlElement->firstChild)) { 

      NSMutableDictionary *tmpAgency = [[NSMutableDictionary alloc] init]; 

      do { 
       [tmpAgency setValue:[TBXML textForElement:agencyXmlElement] forKey:[TBXML elementName:agencyXmlElement]]; 

      // Obtain next sibling element 
      } while ((agencyXmlElement = agencyXmlElement->nextSibling)); 

      [tmpAgencies addObject:tmpAgency]; 
      [tmpAgency release]; 
     } 

    // Obtain next sibling element 
    } while ((agenciesXmlElement = agenciesXmlElement->nextSibling)); 

    return tmpAgencies; 
} 

Thi s函数会返回一个数组,其中包含代表您的RecordsNSDictionary对象。 NSDictionary使用简单,获得您使用的财产[yourDictionary objectForKey:yourXmlNode]。该文档位于:NSDictionary

+0

我已经实现了这个,但是我得到的数组只有第二级以外的任何东西...... – MrPink 2011-03-23 13:44:06

+0

我的示例XML中只有两个级别,agenciesXmlElement-> firstChild正在获得第二级。你必须再次这样做才能深入到关卡中。你有一切在这里做,只是**适应**。 – 2011-03-23 14:27:04

+0

@MrPink这个问题解决了吗? – 2011-03-28 09:10:09