Как я могу разобрать этот XML с помощью анализатора GDataXML? - PullRequest
2 голосов
/ 06 февраля 2012
<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 это 97).

Ответы [ 4 ]

10 голосов
/ 06 февраля 2012

Это простой пример того, как получить некоторые данные. Этот пример очень прост и не использует выражения 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];  
1 голос
/ 06 февраля 2012

Мне показалось, что 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];
0 голосов
/ 06 февраля 2012

Это код ниже, я пробовал.Я получил правильный вывод .. проверить

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 голосов
/ 06 февраля 2012

Если 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"];
...