2011-08-05 12 views
11

के बजाय एंटी-एक्सएमएल का उपयोग करना, मैं स्कैला एक्सएमएल के बजाय http://anti-xml.org का उपयोग करके बोली स्क्रिप्ट का एक पुनःलेख देखना चाहता हूं।एक्सएमएल प्रोसेसिंग का एक उदाहरण लेकिन स्कैला एक्सएमएल

यह स्काला में अध्याय 10 चरवाहा एक्सएमएल से एक अंश है - http://ofps.oreilly.com/titles/9780596155957/HerdingXMLInScalaDSLs.html

// code-examples/XML/reading/pattern-matching-script.scala 
import scala.xml._ 
val someXML = 
<sammich> 
    <bread>wheat</bread> 
    <meat>salami</meat> 
    <condiments> 
    <condiment expired="true">mayo</condiment> 
    <condiment expired="false">mustard</condiment> 
    </condiments> 
</sammich> 

someXML match { 
case <sammich>{ingredients @ _*}</sammich> => { 
    for (cond @ <condiments>{_*}</condiments> <- ingredients) 
     println("condiments: " + cond.text) 
    } 
} 

धन्यवाद

उत्तर

6

मैं antixml से परिचित नहीं हूँ, फिर भी, के रूप में वहाँ कोई अन्य जवाब है, मैं हूँ एक कोशिश

बस रिकार्ड के लिए बनाने के लिए, अपने कोड देता है

mayo 
    mustard 

अधिक सटीक, स्ट्रिंग के अंत और पहले की शुरुआत के बीच रिक्त स्थान/न्यूलाइन के साथ शुरू होता है। मेयो और सरसों के बीच के रिक्त स्थान दो मसालों के बीच होते हैं, और सरसों के बाद रिक्त स्थान बंद होने से पहले होता है।

antixml में, ऐसा करने के लिए पहली बात, अपने कन्वर्ट करने के लिए जो केवल

val someAntiXml = someXML.anti 

मसालों हिस्सा हो रही है लगता है आसान है:

var condiments = someAntiXml \ 'condiments 

फिर एक पाठ को निकालने के लिए है। यह इस

condiments \\ text 

था लेकिन \\ क्रम में संरचना पार नहीं करता है करने के लिए जिस तरह से तरह लग रहा था, यह चौड़ाई-पहले ट्रेवर्सल तरह दिखता है। नतीजतन, रिक्त स्थान, जो केवल मसालों के नीचे हैं, मेयो और सरसों से पहले आता है, जो तत्वों में नीचे एक स्तर हैं।

तो पाठ को पुनर्प्राप्त करने के लिए यहां एक संभावित कार्यान्वयन है। शायद एक और मानक तरीका है, लेकिन मुझे एक नहीं मिला।

def textOf(g: Group[Node]) : String = 
    g.toList.map{ 
    case Elem(_, _, _, _, children) => textOf(children) 
    case t: Text => t.text 
    case c: CDATA => c.text 
    case _ => "" 
    }.mkString 

फिर textOf(someAntiXml \ "condiments") अपेक्षित परिणाम देता है।

+0

थोड़ा देर हो चुकी है लेकिन ... धन्यवाद! – Rodolfo

+2

एंटी-एक्सएमएल 0.3 और बाद में, [\\ गहराई से पहले क्रम में ट्रैवर्स करता है] (https://github.com/djspiewak/anti-xml/issues/49), इसलिए 'मसालों \\ text' अब ठीक काम करता है । – Steve

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