如何还原XML转义字符(XML unescape)?
我希望Scala函数在给定输入时返回字符串如何还原XML转义字符(XML unescape)?,xml,scala,Xml,Scala,我希望Scala函数在给定输入时返回字符串&,类似于所有其他XML转义字符 我试图使用xml。未分析的,可能是错误的,它没有提供所需的输出: scala> val amp = '&' amp: Char = & scala> <a>{amp}</a>.toString res0: String = <a>&</a> scala> import scala.xml._ import scala.x
&
代码>,类似于所有其他XML转义字符
我试图使用xml。未分析的,可能是错误的,它没有提供所需的输出:
scala> val amp = '&'
amp: Char = &
scala> <a>{amp}</a>.toString
res0: String = <a>&</a>
scala> import scala.xml._
import scala.xml._
scala> <a>{amp}</a>.child(0)
res1: scala.xml.Node = &
scala> xml.Unparsed(<a>{amp}</a>.child(0).toString)
res2: scala.xml.Unparsed = &
如果您只是想从XML对象中获取未转换的字符串,text
是您的朋友:
scala> val el = <a>{amp}</a>
el: scala.xml.Elem = <a>&</a>
scala> el.child(0)
res4: scala.xml.Node = &
scala> el.child(0).text
res5: String = &
scala>val el=。获取一个能精确执行您要求的功能并不是非常简单,因为库不进行文本解析(它是由Java SAX解析器完成的),因此您首先需要将“&;code>转换为EntityRef
,以便调用它,考虑到text
的实现是多么简单,这似乎是一种巨大的浪费 我在scala.xml.Utility中没有找到任何东西。。。
我做得又快又脏:
def unescape(text: String): String = {
def recUnescape(textList: List[Char], acc: String, escapeFlag: Boolean): String = {
textList match {
case Nil => acc
case '&' :: tail => recUnescape(tail, acc, true)
case ';' :: tail if (escapeFlag) => recUnescape(tail, acc, false)
case 'a' :: 'm' :: 'p' :: tail if (escapeFlag) => recUnescape(tail, acc + "&", true)
case 'q' :: 'u' :: 'o' :: 't' :: tail if (escapeFlag) => recUnescape(tail, acc + "\"", true)
case 'l' :: 't' :: tail if (escapeFlag) => recUnescape(tail, acc + "<", true)
case 'g' :: 't' :: tail if (escapeFlag) => recUnescape(tail, acc + ">", true)
case x :: tail => recUnescape(tail, acc + x, true)
case _ => acc
}
}
recUnescape(text.toList, "", false)
}
def unescape(文本:字符串):字符串={
def Reconescape(textList:List[Char],acc:String,escapeFlag:Boolean):String={
文本列表匹配{
案例无=>acc
案例“&”::tail=>recurnescape(tail,acc,true)
案例“;”::tail if(escapeFlag)=>recurnescape(tail,acc,false)
案例'a':'m':'p'::tail if(escapeFlag)=>recurnescape(tail,acc+“&”,true)
案例'q':'u':'o':'t'::tail if(escapeFlag)=>recurnescape(tail,acc+“\”,true)
案例“l”:“t”:“tail if(escapeFlag)=>recurnescape(tail,acc+”,true)
案例x::tail=>Reconescape(tail,acc+x,true)
案例=>acc
}
}
Reconescape(text.toList,“,false)
}
scala>unescape(“foo&;bar”)res3:String=foo\bar
def unescape(text: String): String = {
def recUnescape(textList: List[Char], acc: String, escapeFlag: Boolean): String = {
textList match {
case Nil => acc
case '&' :: tail => recUnescape(tail, acc, true)
case ';' :: tail if (escapeFlag) => recUnescape(tail, acc, false)
case 'a' :: 'm' :: 'p' :: tail if (escapeFlag) => recUnescape(tail, acc + "&", true)
case 'q' :: 'u' :: 'o' :: 't' :: tail if (escapeFlag) => recUnescape(tail, acc + "\"", true)
case 'l' :: 't' :: tail if (escapeFlag) => recUnescape(tail, acc + "<", true)
case 'g' :: 't' :: tail if (escapeFlag) => recUnescape(tail, acc + ">", true)
case x :: tail => recUnescape(tail, acc + x, true)
case _ => acc
}
}
recUnescape(text.toList, "", false)
}