2013-03-14 23 views
5

Tôi muốn có một hàm Scala để trả về Chuỗi & khi được nhập &, tương tự cho tất cả các ký tự thoát XML khác.Làm cách nào để hoàn nguyên các ký tự thoát XML (XML unescape)?

Tôi đã cố gắng sử dụng xml.Unparsed, có lẽ trong một cách sai lầm, nó không cung cấp cho tôi những kết quả mong muốn:

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; 

Tôi cũng đã cố gắng sử dụng xml.Utility.unescape, nhưng nó không đưa ra bất cứ kết quả nào cả :

scala> val sb = new StringBuilder 
sb: StringBuilder = 

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

scala> sb.toString 
res1: String = "" 

scala> 

Trả lời

6

Nếu bạn chỉ muốn để có được chuỗi unescaped ra khỏi đối tượng XML, text là bạn của bạn:

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 = & 

Việc triển khai thực hiện điều này là trong scala.xml.EntityRef. Bắt một hàm thực hiện chính xác những gì bạn đang yêu cầu không phải là siêu đơn giản vì thư viện không thực hiện phân tích văn bản (do trình phân tích cú pháp SAX của Java thực hiện) và trước tiên bạn cần biến "&amp;" thành EntityRef để bạn có thể gọi đó, mà có vẻ như một lượng lớn chất thải được thực hiện đơn giản như thế nào là text.

0

tôi đã không tìm thấy bất cứ điều gì trong scala.xml.Utility ... tôi đã làm nó nhanh chóng và dơ bẩn với điều này:

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

bẩn thực sự. 'scala> unescape (" foo & thanh ") res3: String = foo \ bar' – erich2k8

Các vấn đề liên quan