2012-10-15 14 views
5

क्या आप XPath के अनुसार नोड्स को सम्मिलित करने के लिए किसी भी स्कैला एपीआई को जानते हैं और (या) अपडेट करते हैं? जैसे किसी दिए गए नोड और XPath के लिए, इस एपीआई नए नोड के साथ एक्सएमएल की एक प्रतिलिपि बनाने हैंस्कैला - एक्सएमएल डालने/अपडेट

धन्यवाद

+0

एक्सपैथ एक प्रश्न भाषा है। जहां तक ​​मुझे याद है कि आप इसके साथ अपडेट या लिख ​​नहीं सकते हैं। क्या आपका मतलब xslt है? – Jan

+0

XPath का उपयोग नोड को "चुनने" के लिए किया जाएगा और आप एक नोड प्रदान करेंगे जिसे इस "पैरेंट" के लिए एक बच्चे के रूप में जोड़ा जाएगा। btw। मुझे पता है, कि स्कैला एक्सएमएल अपरिवर्तनीय है, लेकिन क्या कोई संभावित तरीका है, इस कार्य को कैसे पूरा किया जाए? – user1746915

+0

[इस] (http://stackoverflow.com/questions/4018300/substituting-xml-values-programatically-with-scala) प्रश्न के बारे में क्या? यह दिखाता है कि स्कैला एक्सएमएल के साथ नोड को कैसे अपडेट किया जाए ... – Jan

उत्तर

0

मुझे क्या होता एक्सएमएल \\

का उपयोग कर पार्स .toList.last.text का उपयोग कर एक सूची एक्सएमएल कन्वर्ट है jsonOption collect यहाँ आप फिर से orElse Some का उपयोग कर कुछ विकल्पों को बदलने और फिर अंत में एक for yield का उपयोग एक्सएमएल मैं चाहता हूँ की उपज के लिए कर सकते हैं:

कि मैं क्या और उसके बाद मेरे विकल्प लेने की जरूरत जोड़ देते हैं।

डेटा रूपांतरण में स्केल की लचीलापन का लाभ उठाएं। यह समान नहीं होना चाहिए लेकिन मुझे यकीन है कि आप प्रकाश देख सकते हैं ...

6

ऐसा करने के लिए आप RewriteRule का उपयोग कर सकते हैं, 2.10.3 documentation

val cats = <Cats> 
    <Cat Name="Floyd"/> 
    <Cat Name="Onyx"/> 
</Cats> 

फिर RewriteRule

class AddCat(name: String) extends RewriteRule { 
    override def transform(n: Node): Seq[Node] = n match { 
    case e: Elem if e.label == "Cats" => 
     val cats = (e \\ "Cat") 
     val newCat = <Cat Name={name}/> 
     new Elem(e.prefix, "Cats", e.attributes, e.scope, e.minimizeEmpty, (cats ++ newCat).toSeq:_*) 
    case x => x 
    } 
} 

तो फिर तुम क्या कर सकता है लगता है,

val rule = new RuleTransformer(new AddCat("Stevie")) 
rule.transform(cats) 
res2: Seq[scala.xml.Node] = List(<Cats><Cat Name="Floyd"/><Cat Name="Onyx"/><Cat Name="Stevie"/></Cats>) 

इसी प्रकार यदि आप एक विशेषता

class AddLastName(name: String, lastName: String) extends RewriteRule { 
    override def transform(n: Node): Seq[Node] = n match { 
    case e: Elem if e.label == "Cat" && (e \\ "@Name" text).equals(name) => 
     val cat: String = e.attributes("Name").head.text 
     e % Attribute(None, "Name", Text(s"$name $lastName"), Null) 
    case x => x 
    } 
} 

val rule = new RuleTransformer(new AddLastName("Stevie", "Nicks")) 
rule.transform(cats) 
res3: Seq[scala.xml.Node] = List(<Cats><Cat Name="Floyd"/><Cat Name="Onyx"/><Cat Name="Stevie Nicks"/></Cats>) 

इन appro दोनों को बदलना चाहते हैं दर्द जो आप खोज रहे हैं वह करेगा। कठिन हिस्सा यह पता लगा रहा है कि बच्चों को कैसे प्राप्त किया जाए, फिर माता-पिता नोड बनाएं।

+0

यह भी: http://stackoverflow.com/a/4019294/1274818 – tysonjh

+0

यह SO पर यहां सबसे अच्छे उत्तरों में से एक है। मुझे विश्वास नहीं है कि इसे और अधिक उत्साह नहीं मिलते हैं और उन्हें सही के रूप में चिह्नित नहीं किया गया है। मैंने देखा है और कई अन्य लोगों को देखा है, लेकिन यह सबसे उपयोगी था। बहुत धन्यवाद @tysonjh। – Philippe

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