8
votes

iPhone tbxml boucle et analyse d'analyse

Fondamentalement, j'ai une réponse XML renvoyée et une chaîne, et j'ai besoin de boucler dans le XML et de stocker toutes les informations dans un tableau. Voici le 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>


1 commentaires

S'il vous plaît voir si vous pouvez accepter plus de réponses. Vous semblez avoir des réponses raisonnables à certaines de vos questions laissées inacceptées.


4 Réponses :


0
votes

Utilisez nsxmlParser ; Cela fait être vieille école et tout mais c'est vraiment efficace.

Configurez votre XMLParser en conséquence (utilisez le protocole nsxmlparserdelegate NSXMLParserDelegate ).

Une fois que votre parser frappe appelez le parser : dadsartélément: nomspaceuri: qualifiésName: attributs: Délégué rappelez et le ellementName est égal à enregistrement (de ce que vous semblez vouloir).

Alloc 'init' un nsmutmédictionnement . Ensuite, comme ci-dessus si ellementname est égal à destination , puis [MyDiction SetObject: elename Forey: @ "destination"]

espère que cela a aidé :).

Petit côté Remarque: préférez utiliser ''s>'s "Technologie" au lieu de 3e Parties: il est plus efficace et les possibilités sont sans fin .


2 commentaires

Cependant, TBXML a été prouvé que l'analyse est très plus rapide à l'analyse de nsxmlParser . J'utilise tbxml et je l'aime. :)


C'est vrai et c'est comme ça que je voudrais le faire. sudo comment utiliseriez-vous tbxml pour analyser mon XML ci-dessus?



14
votes

D'accord, votre première étape serait de faire une classe qui analysera les données. Appelez-le RecordParser , par exemple. Nous devons maintenant ajouter quelques méthodes dans l'en-tête, ainsi qu'un NsmutableArray . XXX

Maintenant, allez-y et facturez votre implémentation. Nous devons maintenant mettre en œuvre ces deux méthodes pour faire ce que nous voulons qu'ils fassent. xxx

essentiellement cette méthode saisira le fichier XML en question et commencera le processus d'analyse d'analyse. En outre, vous initialisez votre tableau et vous le conservez. Maintenant, nous arrivons au fromage. xxx

Fondamentalement, quelle méthode est transversale du fichier XML à la recherche d'un élément avec le nom que vous recherchez, il saisit alors les données des nœuds de l'enfant. De plus, les données sont ajoutées au tableau enregistrements . Donc, fondamentalement, lorsque cela est fait, il devrait avoir les données que vous souhaitez dans votre ensemble enregistrements , que vous pouvez manipuler tout ce que vous voulez.

Ceci est complètement non testé . Ne me blâmez pas si cela souffle de votre ordinateur et tue ton chat. Je ne prendrais normalement pas tout le travail pour écrire une méthode complète comme celle-ci, mais j'arrive à aimer tbxml . S'il vous plaît laissez-moi savoir si cela fonctionne. Je vraiment apprécierait la connaissance.


6 commentaires

OUI! merci cela fonctionne exactement comment je le veux aussi! Mais je suis sur un autre problème avec la sélection des entrées de pataculaire à partir du tableau à utiliser dans une cellule de TableView ... mais merci tant que c'est guéri mes maux de tête 2 jours!


@MRPINK: Il vous suffit de mettre quel ObjectAindex de la matrice que vous souhaitez afficher dans votre table dans CellforNatindexPath .


cell.textlabel.text = [Nstring StringwithFormat: @ "% @", [Records ObjectAindex: indexPath.row]]; C'est ce que j'utilise, mais il imprime tout ce qui est dans chaque enregistrement de la matrice


@MRPINK: Quelles données doivent être affichées? IDENTIFIANT? GUID?


@MRPINK: Pouvez-vous faire une nouvelle question qui a les données en question (le tableau enregistrements ci-dessus) dans votre question? Ensuite, je peux y répondre plus clairement.


Oui OK, veuillez vérifier mon profil et mes questions dans quelques secondes.



-2
votes

Il est préférable d'utiliser NSXMLParser, car il s'agit d'une libération officielle d'Apple.

Toute la documentation de nsxmlParser est ici .

Aussi, voici un NSXMLParser Tutoriel . < / p>


1 commentaires

NsxmlParser est 3 fois plus lent que TBXML. Le fait "Apple" fait qui ne le rend pas mieux.



1
votes

J'ai écrit une fonction récursive pour analyser tout XML correctement créé avec une bibliothèque TBXML.

Dans mon projet, j'ai une classe à analyser XML. Il a une méthode de classe nommée: + (id) InfoOfoNElement: (TBXMLElement *) Elément P>

Comment utiliser: P>

TBXML *tbxml = [TBXML tbxmlWithXMLData:yourData];
TBXMLElement *rootXMLElement = tbxml.rootXMLElement;

id parsedData = [self infoOfElement: rootXMLElement];

    //return NSString or NSDictionary ot NSArray of parsed data
    + (id) infoOfElement: (TBXMLElement*) element
    {
        if (element->text)
            return [TBXML textForElement:element];
        NSMutableDictionary *info = [NSMutableDictionary new];
        TBXMLAttribute *attribute = element->firstAttribute;
        if (attribute) {
            do {
                [info setValue:[TBXML attributeValue:attribute] forKey:[TBXML attributeName:attribute]];
                attribute = attribute -> next;
            } while (attribute);
        }
        TBXMLElement *child = element->firstChild;
        if (child){
            TBXMLElement *siblingOfChild = child->nextSibling;
            //If we have array of children with equal name -> create array of this elements
            if ([[TBXML elementName:siblingOfChild] isEqualToString:[TBXML elementName:child]]){
                NSMutableArray *children = [NSMutableArray new];
                do {
                    [children addObject:[self infoOfElement:child]];
                    child = child -> nextSibling;
                } while (child);
                return [NSDictionary dictionaryWithObject:children forKey:[TBXML elementName:element]];
            }
            else{
                do {
                    [info setValue:[self infoOfElement:child] forKey:[TBXML elementName:child]];
                    child = child -> nextSibling;
                } while (child);
            }
        }            
        return info;
    }


0 commentaires