2010-05-10 44 views
5

我想解析一个苹果plist文件,我需要在其中获得一个数组节点。不幸的是,它唯一的唯一标识符是兄弟节点<key>ProvisionedDevices</key>。现在我最好的想法是使用Java的XPATH查询或Node.indexOf如何使用Scala获得一个与独特节点相邻的节点?

下面是一个例子:

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

谢谢!

回答

5

这工作:

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似乎并没有成为NodeSeq的成员。它在2.8中添加了吗?我使用2.7.7。 – pr1001 2010-05-12 13:52:07

+0

@ pr1001然后,在它之前放置一个'.toList'。 – 2010-05-12 14:00:21

+0

谢谢,这工作。 – pr1001 2010-05-12 21:48:45

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 
    } 

然后你就可以使用这种方式:

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

谢谢,亚当,但你从哪里得到分组方法?它不是Seq和NodeSeq的一种方法。我正在使用Scala 2.7.7。 – pr1001 2010-05-12 21:45:21

+0

这是Scala 2.8 :( – 2010-05-13 01:12:38

+0

好吧,够公平的,谢谢! – pr1001 2010-05-13 07:01:13

相关问题