تحليل عناصر متداخلة متعددة ومتعددة المستويات مع TouchXML

StackOverflow https://stackoverflow.com/questions/1763945

  •  21-09-2019
  •  | 
  •  

سؤال

لدي XML مع الهيكل التالي وأحاول إنشاء كائن النموذج الخاص بي من هذا. هل يمكن لشخص ما مساعدتي في العثور على طريقة للحصول على هذه الكائنات من XML باستخدام TouchXML و NSMutableArray و NSMutabletutionay.

<?xml version="1.0" encoding="utf-8"?>
<response>
  <level1_items>
    <level1_item>
      <item_1>text</item_1>
      <item_2>text</item_2>
    </level1_item>
    <level1_item>
      <item_1>some text</item_1>
      <item_2>some more text</item_2>
  </level1_items>
  <items>
    <item>
      <child_items>
        <child_item>
          <leaf1>node text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>some text</leaf3>
        </child_item>
        <child_item>
          <leaf1>text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>more text</leaf3>
        </child_item>
      </child_items>
    </item>
    <item>
      <child_items>
        <child_item>
          <leaf1>node text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>some text</leaf3>
        </child_item>
        <child_item>
          <leaf1>text</leaf1>
          <leaf2>leaf text</leaf2>
          <leaf3>more text</leaf3>
        </child_item>
      </child_items>
    </item>
  </items>
</response>

أحتاج إلى تحليل <response> وأطفالها.

هل كانت مفيدة؟

المحلول

أولاً ، يجب أن أقول إن XML سيكون من الصعب العمل معه لأنك تحاول استخدام علامة محددة لكل عنصر في قائمة. فمثلا:

  <level1_items>
    <level1_item>
      <item_1>text</item_1>
      <item_2>text</item_2>
    </level1_item>
    <level1_item>
      <item_1>some text</item_1>
      <item_2>some more text</item_2>
  </level1_items>

العلامات المسمىu003Citem_ 1> بu003Citem_ 2> لا معنى لها لأن XML تهدف إلى وصف بياناتك ، وليس تحديدها. إذا كان لديك كيان يسمى عنصر ، فيجب عليك فقط الاتصال به العنصر وجعل XML تبدو هكذا:

  <level1_items>
    <level1_item>
      <item index="1">text</item>
      <item index="2">text</item>
    </level1_item>
    <level1_item>
      <item index="1">some text</item>
      <item index="2">some more text</item>
  </level1_items>

حيث كل العنصر لديه فهرس. لهذه المسألة ، يمكنك فقط تحميل المستند في touchxml cxmldocument والاستيلاء على العقد التي تحتاجها مع xPath وافترض أنها بالترتيب الصحيح تجاهل الفهرس = المعلمة التي حددتها.

المشكلة التالية هي أن تحويل XML إلى nsdictioanry أو nsarray من القواميس هو مهمة متورطة إلى حد كبير وما تكسبه لا يستحق هذا الجهد. ما عليك سوى تحميل XML الخاص بك في cxmldocument ثم ابدأ في الحصول على العقد باستخدام XPath. شيء من هذا القبيل:

CXMLDocument *doc = [[CXMLDocument alloc] initWithXMLString:xmlString options:0 error:nil];

// Returns all 'level1_item' nodes in an array    
NSArray *nodes = [[doc rootElement] nodesForXPath:@"//response/level1_items/level1_item" error:nil];

for (CXMLNode *itemNode in nodes)
{
    for (CXMLNode *childNode in [itemNode children])
    {
        NSString *nodeName = [childNode name]; // should contain item_1 in first iteration
        NSString *nodeValue = [childNode stringValue]; // should contain 'text' in first iteration
        // Do something with the node data.

    }
}

أقترح محاولة استخدام XML بهذه الطريقة ثم عد إلى هنا وطرح أسئلة محددة إذا كان لديك مشاكل.

نصائح أخرى

    -(NSMutableArray *)parseNodeFromXML:(NSString *)strXML readForNode:(NSString *)strReadValue
    {
        NSError *theError = NULL;
        CXMLDocument *theXMLDocument = [[CXMLDocument alloc] initWithXMLString:strXML options:0 error:&theError] ;

        NSMutableArray *arrReturn = [[NSMutableArray alloc] init];
        NSArray *nodes = [[theXMLDocument rootElement] nodesForXPath:strReadValue error:nil];

        for (CXMLNode *itemNode in nodes)
        {

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

            // PROCESS FOR READ ELEMENT ATTRIBUTES IN CURRENT NODE -------------------------

            if([itemNode isMemberOfClass:[CXMLElement class]]){
                CXMLElement *elements=(CXMLElement*)itemNode;
                NSArray *arAttr=[elements attributes];

                for (int i=0; i<[arAttr count]; i++) {
                    if([[arAttr objectAtIndex:i] name] && [[arAttr objectAtIndex:i] stringValue]){
                        [dic setValue:[[arAttr objectAtIndex:i] stringValue] forKey:[[arAttr objectAtIndex:i] name]];
                    }
                }
            }


            // PROCESS FOR READ CHILD NODE IN CURRENT NODE -------------------------

            for (CXMLNode *childNode in [itemNode children])
            {
                //   NSLog(@"count -- %d ---  %@",[childNode childCount],[childNode children]);

                // IF ANY CHILD NODE HAVE MULTIPLE CHILDRENS THEN DO THIS....- 
                if ([childNode childCount] > 1)
                {
                    NSMutableDictionary *dicChild = [[NSMutableDictionary alloc] init];
                    for (CXMLNode *ChildItemNode in [childNode children])
                    {
                        [dicChild setValue:[ChildItemNode stringValue] forKey:[ChildItemNode name]];
                    }
                     [dic setValue:dicChild forKey:[childNode name]];
                }else
                {
                    [dic setValue:[childNode stringValue] forKey:[childNode name]];
                }

            }

            [arrReturn addObject:dic];
        }

        //    NSLog(@"%@",arrReturn);
        return arrReturn;
    }


may this help for multiple get child 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top