मैंने तब से और अधिक सीखा है और मुझे एक और जवाब में बेहतर समाधान माना जाता है। मैंने यह भी तय किया है, जैसा कि मैंने देखा है कि मैं subnode
प्रतिबंध के लिए खाते में विफल रहा था।
प्रश्न के लिए धन्यवाद!एक्सएमएल से निपटने के दौरान मैंने अभी कुछ अच्छी चीजें सीखी हैं। यहां आप जो चाहते हैं वह है:
def updateVersion(node: Node): Node = {
def updateNodes(ns: Seq[Node], mayChange: Boolean): Seq[Node] =
for(subnode <- ns) yield subnode match {
case <version>{ _ }</version> if mayChange => <version>2</version>
case Elem(prefix, "subnode", attribs, scope, children @ _*) =>
Elem(prefix, "subnode", attribs, scope, updateNodes(children, true) : _*)
case Elem(prefix, label, attribs, scope, children @ _*) =>
Elem(prefix, label, attribs, scope, updateNodes(children, mayChange) : _*)
case other => other // preserve text
}
updateNodes(node.theSeq, false)(0)
}
अब, स्पष्टीकरण। पहला और अंतिम मामला विवरण स्पष्ट होना चाहिए। अंतिम एक्सएमएल के उन हिस्सों को पकड़ने के लिए मौजूद है जो तत्व नहीं हैं। या, दूसरे शब्दों में, पाठ। पहले बयान में नोट, हालांकि, ध्वज के खिलाफ परीक्षण यह इंगित करने के लिए कि version
बदला जा सकता है या नहीं।
दूसरा और तीसरा मामला कथन ऑब्जेक्ट एलेम के खिलाफ पैटर्न मैचर का उपयोग करेगा। यह में सभी तत्वों को में इसके घटक भागों को तोड़ देगा। अंतिम पैरामीटर, "बच्चे @ _ *", बच्चों से किसी भी चीज की सूची में मिलेंगे। या, अधिक विशेष रूप से, एक वर्ग [नोड]। फिर हम तत्वों का पुनर्निर्माण करते हैं, जिन हिस्सों को हमने निकाला है, लेकिन सीईसी [नोड] को अपडेट नोड्स को पास करने के लिए, रिकर्सन चरण कर रहे हैं। यदि हम subnode
तत्व के विरुद्ध मेल खाते हैं, तो हम ध्वज बदल सकते हैं true
पर संस्करण बदल सकते हैं, संस्करण के परिवर्तन को सक्षम करते हैं।
अंतिम पंक्ति में, हम नोड से एक सेक [नोड] उत्पन्न करने के लिए node.theSeq का उपयोग करते हैं, और (0) परिणामस्वरूप सीक [नोड] का पहला तत्व प्राप्त करने के लिए। चूंकि अद्यतन नोड्स अनिवार्य रूप से एक नक्शा कार्य है (के लिए ... उपज मानचित्र में अनुवादित है), हम जानते हैं कि परिणाम में केवल एक तत्व होगा। हम false
ध्वज को यह सुनिश्चित करने के लिए पास करते हैं कि version
तब तक बदला जाएगा जब तक subnode
तत्व पूर्वजों का नहीं होता है।
यह ऐसा करने का एक अलग तरीका होता है कि अधिक शक्तिशाली है, लेकिन थोड़ा अधिक वर्बोज़ और अस्पष्ट:
def updateVersion(node: Node): Node = {
def updateNodes(ns: Seq[Node], mayChange: Boolean): Seq[Node] =
for(subnode <- ns) yield subnode match {
case Elem(prefix, "version", attribs, scope, Text(_)) if mayChange =>
Elem(prefix, "version", attribs, scope, Text("2"))
case Elem(prefix, "subnode", attribs, scope, children @ _*) =>
Elem(prefix, "subnode", attribs, scope, updateNodes(children, true) : _*)
case Elem(prefix, label, attribs, scope, children @ _*) =>
Elem(prefix, label, attribs, scope, updateNodes(children, mayChange) : _*)
case other => other // preserve text
}
updateNodes(node.theSeq, false)(0)
}
इस संस्करण में आप किसी भी "संस्करण" टैग, जो कुछ भी यह है बदलने की सुविधा देता उपसर्ग, गुण और गुंजाइश।
बहुत अजीब और लंबी स्वरूपण शैली ... मानक कोडिंग शैली के कुछ और समानता का उपयोग करने का सुझाव देते हैं; आपके आईडीई/संपादक में अंतर्निहित स्वरूपण होना चाहिए, आप इसके साथ शुरू कर सकते हैं। –