我正在使用Scala和Lift框架开发Web应用程序。我在DB中有记录,其中包含页面
的html perex<b>Hi all, this is perex</b>
在一种情况下,我需要打印给用户这个perex,但没有html标签。
Hi all, this is perex
可以在Scala中执行此操作吗?因为我试图与谷歌合作,但没有成功。
感谢所有回复。
答案 0 :(得分:8)
如果字符串是有效的XML,那么您可以使用:
scala.xml.XML.loadString("<b>Hi all, this is parex</b>").text
如果它不是有效的XML,那么您可以使用scala.util.matching.Regex
或HTML解析库,如http://jsoup.org/
答案 1 :(得分:0)
我发现的最佳解决方案是使用cyberneko来解析你的字符串并做一些&#34;聪明的&#34; SAX事件处理。
cyberneko会解析您的HTML,即使它无效,对于您可能在野外遇到的绝大多数HTML都是如此。
如果您注册一个自定义ContentHandler
基本上忽略除character
事件之外的所有事件,只需将它们附加到字符串构建器,那么您将获得良好的初步近似值,并存在令人讨厌的缺陷:由块元素分隔的单词将最终连接在一起(for<br/>example
=&gt; forexample
)。
更好的解决方案是获取所有块元素的列表,并让ContentHandler
收听startElement
个事件。如果元素是块1,则只需在字符串构建器中附加空格字符。
请注意,虽然这似乎工作正常,但它可能不适合您的用例。例如,<br/>
不会变成换行符。如果需要的话,添加它不应该是太多的工作。
答案 2 :(得分:0)
TagSoup应满足您解析realworld html文件的要求。
sbt依赖,
libraryDependencies += "org.ccil.cowan.tagsoup" % "tagsoup" % "1.2.1"
示例代码,
object TagSoupXmlLoader {
private val factory = new SAXFactoryImpl()
def get(): XMLLoader[Elem] = {
XML.withSAXParser(factory.newSAXParser())
}
}
用法,
val root = TagSoupXmlLoader.get().load("http://www.google.com")
println(root)