Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何还原XML转义字符(XML unescape)?_Xml_Scala - Fatal编程技术网

如何还原XML转义字符(XML unescape)?

如何还原XML转义字符(XML unescape)?,xml,scala,Xml,Scala,我希望Scala函数在给定输入时返回字符串&,类似于所有其他XML转义字符 我试图使用xml。未分析的,可能是错误的,它没有提供所需的输出: scala> val amp = '&' amp: Char = & scala> <a>{amp}</a>.toString res0: String = <a>&amp;</a> scala> import scala.xml._ import scala.x

我希望Scala函数在给定输入时返回字符串
&
,类似于所有其他XML转义字符

我试图使用
xml。未分析的
,可能是错误的,它没有提供所需的输出:

scala> val amp = '&'
amp: Char = &

scala> <a>{amp}</a>.toString
res0: String = <a>&amp;</a>

scala> import scala.xml._
import scala.xml._

scala> <a>{amp}</a>.child(0)
res1: scala.xml.Node = &amp;

scala> xml.Unparsed(<a>{amp}</a>.child(0).toString)
res2: scala.xml.Unparsed = &amp;

如果您只是想从XML对象中获取未转换的字符串,
text
是您的朋友:

scala> val el = <a>{amp}</a>
el: scala.xml.Elem = <a>&amp;</a>
scala> el.child(0)
res4: scala.xml.Node = &amp;
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)
}