2010-05-10 13 views
5

Tôi đang cố gắng phân tích cú pháp một tệp plist của Apple và tôi cần có một nút Node trong đó. Rất tiếc, mã định danh duy nhất của nó là anh chị em Node ngay trước nó, <key>ProvisionedDevices</key>. Ngay bây giờ những suy nghĩ tốt nhất của tôi là sử dụng truy vấn XPATH của Java hoặc Node.indexOf.Làm thế nào tôi có thể nhận được một Nút liền kề với một Nút duy nhất bằng cách sử dụng Scala?

Dưới đây là một ví dụ:

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

Cảm ơn!

Trả lời

5

này hoạt động:

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 dường như không phải là thành viên của NodeSeq. Nó đã được thêm vào trong 2,8? Tôi đang sử dụng 2.7.7. – pr1001

+0

@ pr1001 Đặt '.toList' trước đó rồi. –

+0

Cảm ơn, điều đó hoạt động. – 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 
    } 

Sau đó, bạn có thể sử dụng nó theo cách này:

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

Cảm ơn, Adam, nhưng bạn lấy phương pháp được nhóm ở đâu? Nó không phải là một phương thức của Seq hay NodeSeq. Tôi đang sử dụng Scala 2.7.7. – pr1001

+0

Đó là Scala 2.8: ( –

+0

Ok, đủ công bằng. – pr1001