Pregunta

Tengo un XML con la siguiente estructura y estoy tratando de crear mi objeto de modelo de este. Por favor alguien puede ayudarme a encontrar una manera de conseguir estos objetos desde el XML usando TouchXML, NSMutableArray y NSMutableDictionay.

<?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>

Necesito analizar el <response> y sus hijos.

¿Fue útil?

Solución

En primer lugar, tengo que decir que el código XML será difícil trabajar con ellos ya que están tratando de utilizar una etiqueta específica para cada elemento de una lista. Por ejemplo:

  <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>

las etiquetas de nombre , no tienen sentido como XML pretende describir sus datos, no definirla. Si usted tiene una entidad llamada un artículo, probablemente debería simplemente llamarlo elemento y hacer que el código XML siguiente aspecto:

  <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>

Donde cada elemento tiene un índice. Por lo demás, sólo podía cargar el documento en su TouchXML CXMLDocument y agarrar los nodos que necesita con XPath y asumir que están en el orden correcto ignorar el índice = parámetro que se especifica.

La siguiente cuestión es que la conversión de XML a un NSDictioanry o NSArray de los diccionarios es una tarea bastante involucrado y lo que ganas no vale la pena el esfuerzo. Sólo tiene que cargar el código XML en un CXMLDocument y luego comenzar la obtención de nodos utilizando XPath. Algo como esto:

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.

    }
}

Sugiero tratando de usar el XML de esta manera y luego volver aquí y hacer preguntas específicas si tiene problemas.

Otros consejos

    -(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 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top