2012-02-06 79 views
2
<list> 
    <OrderData HASH="1408108039"></OrderData> 
    <OrderData HASH="208524692"> 
     <id>97</id> 
     <customer> 
      <CustomerData HASH="2128670187"></CustomerData></customer> 
     <billingAddress></billingAddress><deliveryAddress></deliveryAddress> 
     <orderDetail> 
      <list> 
       <OrderDetailData HASH="516790072"></OrderDetailData> 
       <OrderDetailData HASH="11226247"></OrderDetailData> 
       <OrderDetailData HASH="11226247"></OrderDetailData> 
      </list> 
     </orderDetail> 
     <log/> 
    </OrderData> 
    <OrderData HASH="1502226778"></OrderData> 
</list> 

我找不到解决方案找到OrderDetailData元素的数量?我也读了http://iphonebyradix.blogspot.com/2011/03/using-gdata-to-parse-xml-file.html这个网址。如何使用GDataXML解析器解析此xml?

在此先感谢。

编辑:

我再解释我的要求。在这个XML中将会有多个OrderData元素。现在我必须计算来自特定OrderData元素的OrderDetailData元素的数量。假设根据我的xml,当前解析的xml有一个OrderData元素,名为id,它的值是97.现在,我必须计算在OrderData (which id`是97中包含多少个OrderDetailData元素。

+0

为什么乌尔不使用的NSXMLParser? – Leena 2012-02-06 06:42:24

+0

因为我必须编辑这个xml.that的意思是我必须重写XML。 – 2012-02-06 06:42:53

+0

试试这个教程:-http://www.raywenderlich。com/725/how-to-read-and-write-xml-documents-with-gdataxml – Leena 2012-02-06 06:52:31

回答

10

这是一个简单的例子如何检索一些数据。这个例子非常简单,不使用XPath表达式。我建议你先理解它是如何工作的,然后使用XPath表达式。在我看来,如果您无法理解解析器的工作方式,那么使用XPath表达式就没有用处了。

NSString* path = [[NSBundle mainBundle] pathForResource:@"test2" ofType:@"xml"]; 

NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:path]; 
NSError *error; 
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData 
                 options:0 error:&error]; 
//NSLog(@"%@", doc.rootElement); // print the whole xml 

NSArray *orderDataArray = [doc.rootElement elementsForName:@"OrderData"]; 

for (GDataXMLElement *orderDataElement in orderDataArray) { 

    if([orderDataElement childCount] > 0) 
    {    
     NSString *attributeForOrderDataElement = [(GDataXMLElement *) [orderDataElement attributeForName:@"HASH"] stringValue]; 

     NSLog(@"attributeForOrderDataElement has value %@", attributeForOrderDataElement); 

     GDataXMLElement* idElement = (GDataXMLElement*)[[orderDataElement elementsForName:@"id"] objectAtIndex:0]; 

     NSLog(@"id has value %@", idElement.stringValue); 

     GDataXMLElement* orderDetailElement = (GDataXMLElement*)[[orderDataElement elementsForName:@"orderDetail"] objectAtIndex:0]; 

     GDataXMLElement* listElement = (GDataXMLElement*)[[orderDetailElement elementsForName:@"list"] objectAtIndex:0];    

     NSArray* orderDetailDataArray = [listElement elementsForName:@"OrderDetailData"]; 

     int count = 0; 
     for (GDataXMLElement *orderDetailDataElement in orderDetailDataArray) { 

      NSString *attributeForOrderDetailDataElement = [(GDataXMLElement *) [orderDetailDataElement attributeForName:@"HASH"] stringValue]; 

      NSLog(@"attributeForOrderDetailDataElement has value %@", attributeForOrderDetailDataElement); 

      count++; 
     } 

     NSLog(@"%d", count); 
    } 
} 

[doc release]; 
[xmlData release]; 

这是输出控制台:

attributeForOrderDataElement has value 208524692 <-- HASH value 
id has value 97 <-- id value 
attributeForOrderDetailDataElement has value 516790072 <-- HASH value 
attributeForOrderDetailDataElement has value 11226247 
attributeForOrderDetailDataElement has value 11226247 
3 <-- the count 

希望它能帮助。

编辑

test2.xml包含您的文件,但你可以把它作为一个字符串。您还可以作为参数传递像串如下:

NSString* xmlString = @"<list>" 
    "<OrderData HASH=\"1408108039\"></OrderData>" 
    "<OrderData HASH=\"208524692\">" 
    "<id>97</id>" 
    "<customer>" 
    "<CustomerData HASH=\"2128670187\"></CustomerData>" 
    "</customer>" 
    "<billingAddress></billingAddress>" 
    "<deliveryAddress></deliveryAddress>" 
    "<orderDetail>" 
    "<list>" 
    "<OrderDetailData HASH=\"516790072\"></OrderDetailData>" 
    "<OrderDetailData HASH=\"11226247\"></OrderDetailData>" 
    "<OrderDetailData HASH=\"11226247\"></OrderDetailData>" 
    "</list>" 
    "</orderDetail>" 
    "<log/>" 
    "</OrderData>" 
    "<OrderData HASH=\"1502226778\"></OrderData>" 
    "</list>";  

GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithXMLString:xmlString options:0 error:&error]; 
+0

只是不错的编程人。 – 2012-02-07 03:57:24

+0

非常感谢您的帮助。非常感谢您。 – 2012-02-07 04:04:40

+0

不客气! – 2012-02-07 08:07:46

0

如果OrderDetailData存在于阵列的第二对象中的所有时间,u可以使用下面的

NSArray* arr = [[XMLelement elementForName:@"list"] elementsForName:@"OrderData"];  
NSXMLElement* listElement = [[[arr objectAtIndex:1] elementForName:@"orderDetail"] elementForName:@"list"]; 
NSArray* orderDetailArray* = [listElement elementsForName:@"OrderDetailData"]; 

在此u能获得阵列中的OrderDetailData元件,和u可以解析在循环中的数据。获得HASH值的使用。

NSString* hash = [[orderDetailArray objectAtIndex:0] stringValueForAttribute:@"HASH"]; 
+0

请仔细阅读该问题。我想使用GdataXml解析器来解析这些数据。 – 2012-02-06 06:48:39

+0

是的,这是通过仅使用GDataXML解析器,只是类名称不同,而不是NSXMLElement你可以使用GDataXMLElement – vishy 2012-02-06 06:55:59

+0

'NSArray * arr = [[XMLelement elementForName:@“list”] elementsForName:@“OrderData”];'when我使用'GDataXMLElement'代替'XMLelement'然后我得到了这个警告'类方法“+ elementForName”找不到“ – 2012-02-06 07:03:09

1

我发现TouchXML容易解析,您可以直接访问从XML

首先下载TouchXML的需要的数据和框架添加libxml2.dylib到项目中。 变化buildsetting的 “头文件搜索路径”,添加 “/ usr/include目录/ libxml2的” 导入TouchXML.h到您的文件

//Access document 
CXMLDocument *parserDoc = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:&err]; 

//Access root element and access children in heirarchy 
CXMLElement *root = [parserDoc rootElement]; 
NSArray *places = [[[root children] objectAtIndex:0] children]; 

否则

//Access node by node 
NSString *location =[[[[[parserDoc nodesForXPath:@"/xml_api_reply/weather/forecast_information/city" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain]; 
+0

我不能使用该解析器,因为我必须编辑我的XML。 – 2012-02-06 08:18:39

+0

我编辑了我的问题,请现在帮助我。 – 2012-02-06 08:29:12

0

这是下面的代码,我努力了。我得到了正确的输出..检查出

NSString* xmlString = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
         "<list>" 
         "<OrderData HASH=\"1408108039\"></OrderData>" 
         "<OrderData HASH=\"208524692\">" 
         "<id>97</id>" 
         "<customer>" 
         "<CustomerData HASH=\"2128670187\"></CustomerData></customer>" 
         "<billingAddress></billingAddress><deliveryAddress></deliveryAddress>" 
         "<orderDetail>" 
         "<list>" 
         "<OrderDetailData HASH=\"516790072\"></OrderDetailData>" 
         "<OrderDetailData HASH=\"11226247\"></OrderDetailData>" 
         "<OrderDetailData HASH=\"11226247\"></OrderDetailData>" 
         "</list>" 
         "</orderDetail>" 
         "<log/></OrderData>" 
         "<OrderData HASH=\"1502226778\"></OrderData>" 
         "</list>"; 

NSXMLDocument* doc = [[NSXMLDocument alloc] initWithData:[xmlString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; 
NSXMLElement* rootElement = [doc rootElement]; 

NSArray* arr = [rootElement elementsForName:@"OrderData"]; 
NSXMLElement* orderDataElement; 

for (int i = 0; i < [arr count]; i++) 
{ 
    int Id = 0; 
    Id = [[arr objectAtIndex:i] integerValueForNode:@"id"]; 
    if (Id != 0) 
    { 
     orderDataElement = [arr objectAtIndex:i]; 
     break; 
    } 
} 

NSArray* orderDetailArray = [[[orderDataElement elementForName:@"orderDetail"] 
           elementForName:@"list"] 
          elementsForName:@"OrderDetailData"]; 

for (int j = 0; j < [orderDetailArray count]; j++) 
{ 
    NSLog(@"%@", [[orderDetailArray objectAtIndex:j] stringValueForAttribute:@"HASH"]); 
} 
+0

非常感谢你,你是非常有用的..我试试这个... – 2012-02-06 11:48:27