2011-03-09 6 views
0

J'essaie de créer une petite application qui utilise xml ou json pour afficher du contenu.JSON/XML parsing iphone NSPredicate

J'ai eu beaucoup de "vues" et je veux en sélectionner une de son identifiant.

look XML comme ça (je peux mettre JSON si vous voulez, mais il est très difficile à lire):

<?xml version="1.0" encoding="utf-8"?> 
<views> 
    <view id="home" type="nav"> 
     <title>Help</title> 
     <section id="1"> 
     <title>Aide</title> 
     <item id="1" link="dev_mac">Dev Mac</item> 
     <item id="2" link="dev_iphone">Dev iPhone</item> 
     <item id="3" link="examples">Examples</item> 
     </section> 
    </view> 
    <view id="dev_mac" type="nav"> 
     <nav_title>Help</nav_title> 
     <content_title>Dev Mac</content_title> 
     <text>balbalbalblablablalbalblalbal</text> 
     <section id="1"> 
     <item id="1" link="lesson_1">Lesson 1</item> 
     <item id="2" link="download">Downlaod</item> 
     </section> 
    </view> 
    <view id="download" type="content"> 
     <nav_title>Dev Mac</nav_title> 
     <title>Lesson 1</title> 
     <content_text>balblablalbalblalbalb</content_text> 
     <content_title>A. UIKit</content_title> 
     <content_text>UIKit is .....</content_text> 
    </view> 
</views> 

J'ai un tableau qui contient 3 NSDictionary (3 vue).

Comment puis-je sélectionner juste une vue par son identifiant?

Merci par avance

BIB1

Répondre

0

Vous ne pouvez pas utiliser NSPredicate sur XML directement. Vous devrez analyser le XML (ou JSON) dans un conteneur Cocoa standard (NSArray, etc) et l'utiliser ensuite. La seule façon de filtrer le XML directement est d'utiliser quelque chose comme XPath, bien que vous deviez passer à libxml pour le faire.

+0

Oui je sais, je ne veux pas utiliser NSPredicate directement sur XML. Mes données XML sont converties en NSDictionary avec XMLReader. mais je ne trouve pas comment utiliser NSPredicate pour sélectionner "élément parent" à partir de est id dans mon NSDictionary (ou NSArray) – Mickael

0

Il devrait fonctionner - aussi longtemps que la variable de données est en fait un tableau contenant un dictionnaire avec la touche « id »

NSArray *data = <your xml> 
NSString *currentViewId = @"home"; 
NSArray *filterd = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(id == %@)", currentViewId]]; 
0

Essayez de reformater le xml comme plist (vous pouvez utiliser xcodes éditeur de plist ou rouleau votre propre) utiliser:

<plist version="1.0"> 
<array> 
    <dict> 
     <key>Title</key><string>Home</string> 
     <key>Image</key><string>Home.png</string> 
    </dict> 
    <dict> 
     <key>Title</key><string>Car</string> 
     <key>Image</key><string>Car.png</string> 
    </dict> 
</array> 
</plist 

Dans le fichier .h:

NSArray *Views_List; 

Dans le fichier .m:

NSString *Views_DataPath = [[NSBundle mainBundle] pathForResource:@"nameOfYourPlist" ofType:@"plist"]; 
    Views_List = [[NSArray alloc] initWithContentsOfFile:Views_DataPath]; 

puis pour accéder à chaque dict:

[[Views_List objectAtIndex: 0] valueForKey:@"Title"]; 

Dans cet exemple (0) retournera 'Home'

+0

malheureusement je ne peux pas utiliser objectAtIndex dans le cas où les vues sont envoyées dans un ordre différent – Mickael