2010-05-10 11 views
5

Estoy tratando de analizar un archivo Plist de Apple y necesito obtener un Nodo de matriz dentro de él. Desafortunadamente, su único identificador único es Nodo hermano justo antes de él, <key>ProvisionedDevices</key>. En este momento, lo mejor es utilizar la consulta XPATH de Java o Node.indexOf.¿Cómo puedo obtener un Nodo adyacente a un Nodo único usando Scala?

Aquí se muestra un ejemplo:

<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> 

Gracias!

Respuesta

5

Esto funciona:

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 no parece ser un miembro de NodeSeq. ¿Fue agregado en 2.8? Estoy usando 2.7.7. – pr1001

+0

@ pr1001 Ponga un '.toList' antes, entonces. –

+0

Gracias, eso funciona. – 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 
    } 

continuación, puede utilizar de esta manera:

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

Gracias, Adam, pero ¿dónde obtienes el método agrupado? No es un método de Seq ni de NodeSeq. Estoy usando Scala 2.7.7. – pr1001

+0

Es Scala 2.8 :( –

+0

Ok, es suficiente. ¡Gracias! – pr1001

Cuestiones relacionadas