2010-05-10 8 views
5

Próbuję przeanalizować plik plist Apple i muszę uzyskać węzeł tablicy w nim. Niestety jego jedynym unikalnym identyfikatorem jest rodzeństwo węzłowe tuż przed nim, <key>ProvisionedDevices</key>. W tej chwili najlepiej jest używać zapytań XPATH Javy lub Node.indexOf.Jak mogę uzyskać węzeł sąsiadujący z unikalnym węzłem przy użyciu Scala?

Oto przykład:

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

Dzięki!

Odpowiedz

5

to działa:

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 nie wydają się być członkiem NodeSeq. Czy zostało dodane w 2.8? Używam 2.7.7. – pr1001

+0

@ pr1001 Umieść przed nim '.toList'. –

+0

Dzięki, że działa. – 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 
    } 

Następnie można użyć go w ten sposób:

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

Dzięki, Adam, ale skąd bierzesz zgrupowaną metodę? Nie jest to metoda Seq ani NodeSeq. Używam Scala 2.7.7. – pr1001

+0

To Scala 2.8 :( –

+0

Dobra, wystarczy. – pr1001

Powiązane problemy