2011-09-27 6 views
5

निम्न को सरल बनाने का कोई तरीका है? या बॉयलरप्लेट कोड को किसी अन्य फ़ंक्शन के साथ कम करें?स्कैला एक्सएमएल, नोड्स प्राप्त करें जहां माता-पिता के पास विशेषता मूल्य मिलान

scala> val ns = <foo><bar id="1"><tag>one</tag><tag>uno</tag></bar><bar id="2"><tag>two</tag><tag>dos</tag></bar></foo> 
ns: scala.xml.Elem = <foo><bar id="1"><tag>one</tag><tag>uno</tag></bar><bar id="2"><tag>two</tag><tag>dos</tag></bar></foo> 

scala> (ns \\ "bar" filterNot{_ \\ "@id" find { _.text == "1" } isEmpty}) \\ "tag" 
res0: scala.xml.NodeSeq = NodeSeq(<tag>one</tag>, <tag>uno</tag>) 

उत्तर

15

मैं ही एक छोटी सी सुधार मिल सकता है, find/isEmpty परीक्षण exists साथ बदला जा सकता:

टिप्पणी को स्पष्ट करने के बाद
(ns \\ "bar" filter { _ \\ "@id" exists (_.text == "1") }) \\ "tag" 

संपादित करें:

वास्तव में एक अच्छा विचार है कि! आकार के लिए इसे आज़माएं:

import xml._ 

implicit def richNodeSeq(ns: NodeSeq) = new { 

    def \@(attribMatch: (String, String => Boolean)): NodeSeq = 
    ns filter { _ \\ ("@" + attribMatch._1) exists (s => attribMatch._2(s.text)) } 

} 

ns \\ "bar" \@ ("id", _ == "1") \\ "tag" 

मैंने गुण मूल्य तुलना को हार्ड-कोडिंग के बजाय एक अनुमान का उपयोग किया।

+1

सुधार के लिए धन्यवाद। मैं वास्तव में क्या देख रहा हूं फ़िल्टर {_ \\ "@id" मौजूद है (_.text == "1") के लिए चयनकर्ता बनाने का एक तरीका है (_.text == "1")} तो यह कुछ ऐसा लगता है (x \\ "bar" \ @ ("@id", "1") \\ "टैग" – eptx

+0

मुझे आपका विचार पसंद है। मैंने अपने उत्तर को एक संभावित समाधान के साथ संपादित किया है। – Lachlan

संबंधित मुद्दे