Как я могу проанализировать этот XML с помощью анализатора GDataXML?
<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 этот URL.
Заранее спасибо.
Редактировать:
Я объясняю свое требование еще раз. В этом XML будет несколько OrderData
элемент. Теперь я должен посчитать количество OrderDetailData
Elemnts из определенного OrderData
элемент. Предположим, что согласно моему xml текущий проанализированный xml имеет OrderData
элемент, названный id
и его значение составляет 97. Теперь я должен посчитать, сколько OrderDetailData
элементы содержатся в OrderData(which
id` 97).
4 ответа
Это простой пример того, как получить некоторые данные. Этот пример очень прост и не использует выражения 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];
Я обнаружил, что TouchXML прост в разборе, и вы можете напрямую получить доступ к нужным данным из xml.
Прежде всего, скачайте TouchXML и добавьте фреймворк libxml2.dylib в ваш проект. измените настройку сборки на "Путь поиска заголовка" и добавьте "/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];
Это код ниже, я пытался. Я получил правильный вывод.. проверить
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"]);
}
Если OrderDetailData присутствует во 2-м объекте массива все время, вы можете использовать ниже
NSArray* arr = [[XMLelement elementForName:@"list"] elementsForName:@"OrderData"];
NSXMLElement* listElement = [[[arr objectAtIndex:1] elementForName:@"orderDetail"] elementForName:@"list"];
NSArray* orderDetailArray* = [listElement elementsForName:@"OrderDetailData"];
В этом вы можете получить элементы OrderDetailData в массиве, и вы можете анализировать данные в цикле. чтобы получить значение HASH.
NSString* hash = [[orderDetailArray objectAtIndex:0] stringValueForAttribute:@"HASH"];