属性名、現在の属性値、および属性に必要な新しい値を提供することで、ユーザーが XML 属性を変更できるようにする XML 解析ユーティリティを作成しようとしています。これが私のコードです:
def main (args: Array[String]) {
val xml= <Rule debug="true" expression="testing"/>
val printable= replaceXMLEntryAttribute(xml, "debug", "true", "false")
println(printable)
}
/**
* This method is used to iterate over the entirety of the xml presented and modify the XML attribute desired
*/
def replaceXMLEntryAttribute(elem: Elem, attrName: String, curVal: String, desiredVal: String): Elem = {
def replace(current: Elem): Elem = current.copy(
child = current.map {
case e: Elem if isReplacementEntry(current, attrName, curVal) ⇒ generateReplacementXMLAttribute(current)
case e: Elem ⇒ replace(e)
case other⇒ other
}
)
def generateReplacementXMLAttribute(node: Elem): Elem = {
val currentXML= node.toString()
val newAttr= currentXML.replace(curVal, desiredVal)
return XML.loadString(newAttr)
}
replace(elem)
}
private def isReplacementEntry(node: Elem, attributeName: String, currentAttrValue: String): Boolean = {
val attr = "@" + attributeName
val exists = node \\ attr find { _.text == currentAttrValue }
exists match{
case None => false
case _ => true
}
目的の出力は<Rule debug="false" expression="testing"/>
、プログラムの結果が<Rule debug="true" expression="testing"><Rule expression="testing" debug="false"/></Rule>
ここでは、replace メソッドが台無しになっているとしか言いようがありません。