how can i parse this xml using TBXML in objective c?

泪湿孤枕 提交于 2019-12-11 18:17:20

问题


I Know my xml looking very much odd but nothing to do.Now my problem is how can i parse this xml attribute and its value using TBXML?? Please anybody help me.Thanks in Advance.

−<order>
 <id>100</id>
  <order_date>October 13th, 2011 at 2:43 PM</order_date>
 −<customer>
   <id>45</id>
   <name>John Kramer</name>
   −<address>
     −<billing>167 Yarra Street, South Yarra, Melbourne, Australia</billing>
     −<shipping>35 Victoria, Street, North Yarra, Melbourne, Australia</shipping>
      <email> johnkramer@hotmail.com</email>
      <phone> +6546325478 </phone>
     </address>
   </customer>
  −<products>
    −<product>
    <id>12</id>
    <name>Asus F5RL</name>
   −<description>Color: Blue. Size: Square.</description>
    <qty>2</qty>
    <unit_price>50 AUD</unit_price>
    <total_price>100 AUD</total_price>
   </product>
  −<product>
   <id>12</id>
   <name>Acer F4</name>
   <description>Color: Red</description>
   <qty>3</qty>
   <unit_price>40 AUD</unit_price>
   <total_price>120 AUD</total_price>
  </product>
 </products>

 -<price_details>
    <subtotal>220 AUD</subtotal>
    <discount>20 AUD</discount>
    <tax> 10 AUD </tax>
    <shipment> 5 AUD </shipment>
    <grand_total> 235 AUD </grand_total>
  </price_details>
 <order_status>Pending </order_status>
</order>

still now i have done this but it is crashing.

- (void)traverseElement:(TBXMLElement *)element {
do {
    NSLog(@"%@",[TBXML elementName:element]);
    if (element->firstChild) 
        [self traverseElement:element->firstChild];


    TBXMLAttribute * attribute = element->firstAttribute;

    // if attribute is valid
    while (attribute) {
        // Display name and value of attribute to the log window
        NSLog(@"%@->%@ = %@",
              [TBXML elementName:element],
              [TBXML attributeName:attribute],
              [TBXML attributeValue:attribute]);

        // Obtain the next attribute
        attribute = attribute->next;
    }

    if ([[TBXML elementName:element] isEqualToString:@"order"]) {
        NSLog(@"xml element checking");
        TBXMLElement *order_id = [TBXML childElementNamed:@"id" parentElement:element];
        TBXMLElement *order_date = [TBXML childElementNamed:@"order_date" parentElement:element];
        TBXMLElement *customer = [TBXML childElementNamed:@"customer" parentElement:element];

        TBXMLElement *customer_id = [TBXML childElementNamed:@"id" parentElement:customer];
        TBXMLElement *customer_name = [TBXML childElementNamed:@"name" parentElement:customer];
        [records addObject:[NSArray arrayWithObjects:
                            [TBXML textForElement:customer_id],
                            [TBXML textForElement:customer_name],
                            [TBXML textForElement:order_id],
                            [TBXML textForElement:order_date],nil ] ];
        NSLog(@"customer id: %@",customer_id);
        NSLog(@"customer name: %@",customer_name);

    }   

回答1:


I have solve this problem may be it will helpful for someone...

- (void)traverseElement:(TBXMLElement *)element {
do {
    NSLog(@"%@",[TBXML elementName:element]);
    if (element->firstChild) 
        [self traverseElement:element->firstChild];


    TBXMLAttribute * attribute = element->firstAttribute;

    // if attribute is valid
    while (attribute) {
        // Display name and value of attribute to the log window
        NSLog(@"%@->%@ = %@",
              [TBXML elementName:element],
              [TBXML attributeName:attribute],
              [TBXML attributeValue:attribute]);

        // Obtain the next attribute
        attribute = attribute->next;
    }

    if ([[TBXML elementName:element] isEqualToString:@"order"]) {
        NSLog(@"xml element checking");
        TBXMLElement *order_id = [TBXML childElementNamed:@"id" parentElement:element];
        TBXMLElement *order_date = [TBXML childElementNamed:@"order_date" parentElement:element];
        TBXMLElement *order_customer = [TBXML childElementNamed:@"customer" parentElement:element];
        NSLog(@"order id: %@ %@ %@",[TBXML textForElement:order_id],[TBXML textForElement:order_date],[TBXML textForElement:order_customer]);
        if([[TBXML elementName:order_customer] isEqualToString:@"customer"]){
            TBXMLElement *customer_id = [TBXML childElementNamed:@"id" parentElement:order_customer];
            TBXMLElement *customer_name = [TBXML childElementNamed:@"name" parentElement:order_customer];
            TBXMLElement *customer_address = [TBXML childElementNamed:@"address" parentElement:order_customer];
            NSLog(@"order id: %@ %@ %@",[TBXML textForElement:customer_id],[TBXML textForElement:customer_name],[TBXML textForElement:customer_address]);
            if([[TBXML elementName:customer_address] isEqualToString:@"address"]){
                TBXMLElement *address_billing = [TBXML childElementNamed:@"billing" parentElement:customer_address];
                [records addObject:[NSArray arrayWithObjects:
                                    [TBXML textForElement:order_id],
                                    [TBXML textForElement:order_date],
                                    [TBXML textForElement:customer_id],
                                    [TBXML textForElement:customer_name],
                                    [TBXML textForElement:address_billing],nil]];
            }
        }

      //  TBXMLElement *order_status = [TBXML childElementNamed:@"status" parentElement:element];

        //NSLog(@"%@",[TBXML textForElement:id]);
        // NSArray *newArray = [[NSArray alloc] init];

    }
    [myTable reloadData];
} while ((element = element->nextSibling));
}



回答2:


Try with JSon parser. For your better understanding see this link. and this link. Download JSon parser from this link.

check with this thread.



来源:https://stackoverflow.com/questions/7976414/how-can-i-parse-this-xml-using-tbxml-in-objective-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!