2010-05-10 6 views
5

Je suis en train d'analyser un fichier plist d'Apple et j'ai besoin d'un tableau en son sein. Malheureusement, son seul identifiant unique est le nœud frère juste avant lui, <key>ProvisionedDevices</key>. En ce moment mes meilleures pensées sont d'utiliser l'interrogation XPATH de Java ou Node.indexOf.Comment puis-je obtenir un nœud adjacent à un nœud unique en utilisant Scala?

est un exemple:

<plist version="1.0"> 
     <dict> 
       <key>ApplicationIdentifierPrefix</key> 
       <array> 
         <string>RP8CBF4MRE</string> 
       </array> 
       <key>CreationDate</key> 
       <date>2010-05-10T11:44:35Z</date> 
       <key>DeveloperCertificates</key> 
       <array> 
       ... 
       <key>ProvisionedDevices</key> 
       <array> 
       ... // I need the Nodes here 
       </array> 
     </dict> 
</plist> 

Merci!

Répondre

5

Cela fonctionne:

def findArray(key: Elem, xml: Elem) = { 
    val components = xml \ "dict" \ "_" 
    val index = components.zipWithIndex find (_._1 == key) map (_._2) 
    index map (_ + 1) map components 
} 
+0

zipWithIndex ne semble pas être un membre de NodeSeq. A-t-il été ajouté en 2,8? J'utilise 2.7.7. – pr1001

+0

@ pr1001 Mettez un '.toList' avant, alors. –

+0

Merci, ça fonctionne. – pr1001

5
/** 
    * Takes in plist key-value format and returns a Map[String, Seq[Node]] 
    */ 
    def plistToMap(nodes:Seq[Node]) = { 
    nodes.grouped(2).map { 
     case Seq(keyNode, elementNode) => (keyNode.text, elementNode) 
    }.toMap 
    } 

Ensuite, vous pouvez l'utiliser de cette façon:

println(plistToMap(xml \\ "dict" \ "_").get("ProvisionedDevices")) 
+0

Merci, Adam, mais où trouvez-vous la méthode groupée? Ce n'est pas une méthode de Seq ni NodeSeq. J'utilise Scala 2.7.7. – pr1001

+0

C'est Scala 2.8 :( –

+0

Ok, assez bien, merci! – pr1001

Questions connexes