2011-01-07 17 views
9

में नोड के सभी बाल तत्वों का चयन करें मैं "ए" नामक नोड के पहले बच्चे एलेम का चयन करना चाहता हूं। अब मुझे क्या मिला है:स्केल

(xml \ "a")(0).child.collect {case e: Elem => e} 

यह काफी verbose है। मैं कुछ ढूंढ रहा था:

xml \ "a" \ "*" 

क्या यह स्केल में संभव है?

उत्तर

11

आप या \\ विधियों के साथ NodeSeq पर कुछ भी नहीं कर सकते हैं। लेकिन आप एक नया \* विधि (ध्यान दें कमी या अंतरिक्ष चरित्र) साथ NodeSeq विस्तार कर सकते हैं दलाल-your-पुस्तकालय पैटर्न के अनुसार,:

import xml.{NodeSeq, Elem} 

class ChildSelectable(ns: NodeSeq) { 
    def \* = ns flatMap { _ match {          
    case e:Elem => e.child         
    case _ => NodeSeq.Empty         
    } } 
} 

implicit def nodeSeqIsChildSelectable(xml: NodeSeq) = new ChildSelectable(xml) 

आरईपीएल में, यह तो मुझे देता है:

scala> val xml = <a><b><c>xxx</c></b></a> 
xml: scala.xml.Elem = <a><b><c>xxx</c></b></a> 

scala> xml \*                    
res7: scala.xml.NodeSeq = NodeSeq(<b><c>xxx</c></b>) 

scala> xml \ "b" \* 
res8: scala.xml.NodeSeq = NodeSeq(<c>xxx</c>) 

scala> xml \ "b" \ "c" \* 
res9: scala.xml.NodeSeq = NodeSeq(xxx) 
6

यह सुंदर के करीब है आप के लिए क्या देख रहे:

import scala.xml.Elem 

val xml = <a><b><c>HI</c></b></a> 

println(xml) 
println(xml \ "_") 
println(xml \ "b") 
println(xml \ "b" \ "_") 
println(xml \ "b" \ "c") 
println(xml \ "b" \ "c" \ "_") 


<a><b><c>HI</c></b></a> 
<b><c>HI</c></b> 
<b><c>HI</c></b> 
<c>HI</c> 
<c>HI</c> 
// Empty 
+0

गु स्वीकार किए गए उत्तर से बेहतर है। एक नई विधि लिखने की आवश्यकता के बिना, "_" 'वास्तव में क्या पूछा गया था। बनाए रखने के लिए कम कोड, अगले कोड को आपके कोड को देखने में भ्रमित करने के लिए कम गैर मानक सिंटैक्स। – rumtscho

+0

इस आयनसर को अधिक महत्व न दें। स्कैला-एक्सएमएल टूटा हुआ है। Https://github.com/lihaoyi/scalatags या https://github.com/chris-twiner/scalesXml जैसे कुछ का उपयोग करें –