5

他のすべての XML エスケープ文字と同様に、&入力が与えられたときにScala 関数が String を返すようにしたいと考えています。&

を使用しようとしましたがxml.Unparsed、おそらく間違った方法で、目的の出力が得られません。

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.Utility.unescapeたが、まったく出力がありません。

scala> val sb = new StringBuilder
sb: StringBuilder = 

scala> xml.Utility.unescape("&amp;", sb)
res0: StringBuilder = null

scala> sb.toString
res1: String = ""

scala> 
4

2 に答える 2

6

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.xml.EntityRefます。ライブラリはテキストの解析を行わないため (Java SAX パーサーによって行われます)、必要な機能を正確に実行する関数を取得するのは非常に簡単ではありません"&amp;"EntityRefの実装がいかに単純であるかを考えると、これは大量の無駄のように思えtextます。

于 2013-03-14T11:10:35.393 に答える
0

私は 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)
}
于 2014-01-20T10:19:16.933 に答える