TBXML разбирает сложный xml в массив - PullRequest
2 голосов
/ 22 марта 2011

У меня есть XML-ответ, который мне нужно установить в массив.Проблема в том, что мне нужно получить доступ к каждому элементу и сохранить его в массиве, чтобы я мог использовать его для просмотра таблицы.

<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schema.2sms.com/2.0/schema/0310_ResponseReportStandard.xsd" Version="1.0">
    <Error>
        <ErrorCode>00</ErrorCode>
        <ErrorReason>OK</ErrorReason>
    </Error>
    <ResponseData>
        <Identification>
            <UserID>jonathan.pink@2sms.com</UserID>
        </Identification>
        <Result>2 records were returned</Result>
        <Detail>
            <ReportTitle>Message Summary: Today</ReportTitle>
            <Record>
                <Destination>447790686158</Destination>
                <Status>WithNetwork</Status>
                <GUID><![CDATA[2011-03-22T10:54:22.097Z]]></GUID>
                <DateSubmitted>2011-03-22T10:54:22.097</DateSubmitted>
                <DateToSend></DateToSend>
                <DateSent>2011-03-22T10:54:22.533</DateSent>
                <DateReceived></DateReceived>
                <Message><![CDATA[Yet again another test]]></Message>
                <ID>2011-03-22 10:54:22.250HIHIIOJTFVETW85TS</ID>
            </Record>
            <Record>
                <Destination>447790686158</Destination>
                <Status>SUCCESS</Status>
                <GUID><![CDATA[2011-03-22T10:50:40.064Z]]></GUID>
                <DateSubmitted>2011-03-22T10:50:40.063</DateSubmitted>
                <DateToSend></DateToSend>
                <DateSent>2011-03-22T10:50:42.473</DateSent>
                <DateReceived>2011-03-22T10:50:54.570</DateReceived>
                <Message><![CDATA[This is a test]]></Message>
                <ID>2011-03-22 10:50:40.210DRUDVMCEZGETW85TS</ID>
            </Record>
            <ReportPage ReportID="775797" ItemsPerPage="25" Page="1" TotalItems="2" />
        </Detail>
    </ResponseData>
</Response>

Я инициализировал объект TBXML, но не могу понять, как его получить.из повторяющейся информации, я знаю, что понадобится какой-то цикл, но я довольно плохо знаком с целью-c, так что это вызов.

Мне нужно получить <destination> , <status>, <datesent>, <message> из XML.Может быть до 25 записей ....

Надеюсь, что кто-то может помочь, это делало мою голову весь день!

1 Ответ

6 голосов
/ 22 марта 2011

Я недавно сделал нечто похожее, чтобы вы могли быстро адаптироваться, мой XML был:

<?xml version="1.0" encoding="ISO-8859-1"?>
<agencies>
    <agency>
        <name>Agency 1 name</name>
        <addressFirstLine>Immeuble XYZ<addressFirstLine>
        <addressSecondLine>rue de la republique</addressSecondLine>
        <addressThirdLine>69007 Lyon</addressThirdLine>
        <telNumber>01 23 45 67 89</telNumber>
    </agency>
    <agency>
        <name>Agency 2 name</name>
        <addressFirstLine>Immeuble ABC<addressFirstLine>
        <addressSecondLine>rue de la republique</addressSecondLine>
        <addressThirdLine>69007 Lyon</addressThirdLine>
        <telNumber>01 23 45 67 89</telNumber>
    </agency>
</agencies>

Код, который я использовал для анализа этого (получить результат в моем NSArray, называемом agencies):

    TBXML *tbxml = [[TBXML tbxmlWithXMLFile:yourXmlFile retain];
    TBXMLElement *rootXMLElement = tbxml.rootXMLElement;

    if (rootXMLElement) {
        self.agencies = [self traverseElement:rootXMLElement];
        [delegate managerDidReceiveData];
    }

    // release resources
    [tbxml release];

И моя функция для преобразования в массив:

- (NSArray *)traverseElement:(TBXMLElement *)element {

    NSMutableArray *tmpAgencies = [[NSMutableArray alloc] init];

    TBXMLElement *agenciesXmlElement = element->firstChild;
    TBXMLElement *agencyXmlElement;

    do {

        // if the element has child elements, process them
        if ((agencyXmlElement = agenciesXmlElement->firstChild)) {

            NSMutableDictionary *tmpAgency = [[NSMutableDictionary alloc] init];

            do {
                [tmpAgency setValue:[TBXML textForElement:agencyXmlElement] forKey:[TBXML elementName:agencyXmlElement]];

            // Obtain next sibling element
            } while ((agencyXmlElement = agencyXmlElement->nextSibling));

            [tmpAgencies addObject:tmpAgency];
            [tmpAgency release];
        }

    // Obtain next sibling element
    } while ((agenciesXmlElement = agenciesXmlElement->nextSibling));

    return tmpAgencies;
}

Эта функция вернет вам массив, который содержит NSDictionary объектов, представляющих ваш Records.NSDictionary прост в использовании, чтобы получить свойство, которое вы используете [yourDictionary objectForKey:yourXmlNode].Документ здесь: NSDictionary .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...