Как разобрать следующий xml: случай рекурсии - PullRequest
0 голосов
/ 29 марта 2012

У меня есть следующий xml.Я пытаюсь разобрать это с помощью gdataxml parser.Я могу разобрать первую часть xml, от <myBean> до </myBean>, но со второй части, начиная с <trackBean>, становится все труднее, когда trackBean повторяется внутри.Мне трудно разработать логику для этого.Я застрял здесь на 2-й день.

 <return>
   <myTrackBean>
    <myBean>
                <myStatus>false</myStatus>
                <hisStatus>false</hisStatus>
                 <secondVcardBean>
                     <contactId>108</contactId>                         
                     <myNumber>KXUOYHGCIO</myNumber>
                     <userId>56</userId>
                     <version>1</version>                         
                </secondVcardBean>
                <myNumber>KXUOYHGCIO</myNumber>
            </myBean>
            <trackBean>
               <myBean>
                  <myStatus>false</myStatus>
                  <hisStatus>false</hisStatus>
                  <secondVcardBean>
                     <contactId>105</contactId>
                     <myNumber>5D1X7XP6CW</myNumber>
                     <userId>54</userId>
                     <version>1</version>
                 </secondVcardBean>
                 <myNumber>5D1X7XP6CW</myNumber>
             </myBean>
             <trackBean>
                <myBean>
                     <myStatus>false</myStatus>
                     <hisStatus>false</hisStatus>
                     <secondVcardBean>
                         <contactId>103</contactId>
                         <myNumber>0C3RM5UKBB</myNumber>
                         <userId>53</userId>
                         <version>8</version>
                     </secondVcardBean>
                    <myNumber>0C3RM5UKBB</myNumber>
                </myBean>
          </trackBean>
      </trackBean>
  </myTrackBean>
</return>

Ниже приведен код, который я использовал для разбора первой части, с первой <myBean> до <<code>myBean>.Как я могу проверить, существует ли <trackBean> внутри его родителя <trackBean>

NSArray * array = [node nodesForXPath:@"//return/myTrackBean" error:nil];

            int noOfmyTrackBean = [array count];

            for(int i = 1; i<= noOfmyTrackBean; i++){


                NSString *tempXmlData = [NSString stringWithFormat:@"//return/myTrackBean/myBean"];

                NSString *myStatus = [node nodeStringForXPath:[tempXmlData stringByAppendingString:@"/myStatus"]];

                NSString *hisStatus = [node nodeStringForXPath:[tempXmlData stringByAppendingString:@"/hisStatus"]];

                NSString *contactId = [node nodeStringForXPath:[tempXmlData stringByAppendingString:@"/secondVcardBean/contactId"]];

                NSString *myNumber = [node nodeStringForXPath:[tempXmlData stringByAppendingString:@"/secondVcardBean/myNumber"]];

Я понимаю, что сложность заключается в получении дочернего узла <trackBean> внутри <trackBean>

Ответы [ 2 ]

1 голос
/ 14 апреля 2012

Я думаю, вам не нужно сильно беспокоиться о рекурсии, поскольку gdataxml, кажется, обрабатывает эту часть внутренне.Вы можете просто разобрать его как обычно, так как объект синтаксического анализа берет количество узлов, которые повторяются внутри себя.Я не знаю, если это именно то, что вам нужно, но это определенно поможет вам.

NSArray * array = [node nodesForXPath:@"//return/myTrackBean" error:nil];
            NSLog(@"count  :%d",[array count]);
            NSLog(@"Node  :%@",node);

            int noOfPrimaryNodes = [array count];

            for(int i = 1; i<= noOfPrimaryNodes; i++){

                //For use from the second node
                NSString *myxmlData = [NSString stringWithFormat:@"//return/myTrackBean/trackBean"];
                NSLog(@"myxmlData  :%@",myxmlData);


                NSArray *array = [node nodesForXPath:@"//return/myTrackBean/trackBean" error:nil];

                NSLog(@"Array count %d", [array count]);
                if([array count]>0){
                GDataXMLElement *myNode = [[node nodesForXPath:@"//return/myTrackBean/trackBean" error:&error]objectAtIndex:0];
                 NSLog(@"myNode  :%@",myNode);



                NSString *changingNode = @"//trackBean";


                for(int j = 0; j < [array count]; j++){

                    NSString *myStatus = [node nodeStringForXPath:[changingNode stringByAppendingString:@"/myBean/myStatus"]];
                    NSString * hisStatus = [node nodeStringForXPath:[changingNode stringByAppendingString:@"/myBean/hisStatus"]];
                    NSString *contactId = [node nodeStringForXPath:[changingNode stringByAppendingString:@"/myBean/secondVcardBean/contactId"]];
                    NSString *myNumber = [node nodeStringForXPath:[changingNode stringByAppendingString:@"/myBean/secondVcardBean/myNumber"]];
                    NSString *versionNumber = [node nodeStringForXPath:[changingNode stringByAppendingString:@"/myBean/secondVcardBean/versionNumber"]];
         }

Надеюсь, это поможет.

0 голосов
/ 30 марта 2012
...