2013-03-14 16 views
5

他のすべてのXMLエスケープ文字について同様に入力&が与えられたときに、スカラ関数が文字列&を返すようにしたいと思います。XMLエスケープ文字を元に戻すには(XML unescape)?

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を使用しようとしましたが、それはまったくの出力を与えるものではありません:

は、私はそれが私の所望の出力を与えるものではありません、多分間違った方法で、xml.Unparsedを使用しようとしました:

scala> val sb = new StringBuilder 
sb: StringBuilder = 

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

scala> sb.toString 
res1: String = "" 

scala> 

答えて

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の実装がどれほどシンプルであるかを考えれば、大量の廃棄物のように思える。私はこれで迅速かつ汚いことをやった

私はscala.xml.Utilityには何も見つかっていない
0

... :確かに

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) 
} 
+0

汚いです。 'scala> unescape(" foo & bar ") res3:String = foo \ bar' – erich2k8

関連する問題