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>
4 Réponses :
Utilisez Configurez votre XMLParser en conséquence (utilisez le protocole Une fois que votre parser frappe appelez le parser Alloc 'init' un espère que cela a aidé :). p>
Petit côté Remarque: préférez utiliser nsxmlParser code>; Cela fait être vieille école et tout mais c'est vraiment efficace. P>
nsxmlparserdelegate NSXMLParserDelegate code>). P>
: dadsartélément: nomspaceuri: qualifiésName: attributs: code> Délégué rappelez et le
ellementName code> est égal à
enregistrement code> (de ce que vous semblez vouloir). P>
nsmutmédictionnement code>. Ensuite, comme ci-dessus si
ellementname code> est égal à
destination code>, puis
[MyDiction SetObject: elename Forey: @ "destination"] p >
''s>'s code> "Technologie" au lieu de 3e Parties: il est plus efficace et les possibilités sont
Cependant, TBXML a été prouvé que l'analyse est très plus rapide à l'analyse de nsxmlParser code>. 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?
D'accord, votre première étape serait de faire une classe qui analysera les données. Appelez-le 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. P> 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. P> 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 code> enregistrements code>. Donc, fondamentalement, lorsque cela est fait, il devrait avoir les données que vous souhaitez dans votre ensemble code> enregistrements code>, que vous pouvez manipuler tout ce que vous voulez. P> RecordParser code>, par exemple. Nous devons maintenant ajouter quelques méthodes dans l'en-tête, ainsi qu'un
NsmutableArray code>.
tbxml code>. S'il vous plaît laissez-moi savoir si cela fonctionne. Je
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 code> de la matrice que vous souhaitez afficher dans votre table dans
CellforNatindexPath code>.
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 code> enregistrements code> 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.
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; }
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.