我的内容为xml
<p/>
<p>Highlighted Applications</p>
<p/>
<table>
<tbody>
<tr> <td>
<p>Projects </p>
</td> <td>
<p>Description</p>
</td>
</tr>
<tr> <td>
<p>VNC login for Windows Mobile devices</p>
</td> <td>
它可能有自定义标签,我事先并不知道。是否可以从xml上面获取文本而不需要遍历xml-tree并在java / scala中逐个删除每个标记。我遇到了this,但这是为了删除不必要的标记而不删除所有标记?我正在寻找一些通用的解决方案,可以删除所有标签或从xml获取所有文本。
必填项:
Highlighted Applications
Projects
Description
VNC login for Windows Mobile devices
我对任何其他方法/图书馆建议持开放态度?
答案 0 :(得分:2)
如果您可以将xml文件的所有内容都作为字符串获取,我会建议这样:
您可以将replaceAll与正则表达式\<.*?\>
一起使用,如下所示:
str.replaceAll("\\<.*?\\>", "")
替换您可以使用的所有空行:
str.replaceAll("(?m)^[ \t]*\r?\n", "")
查看此内容
最后的输出应该如下:
Highlighted Applications
Projects
Description
VNC login for Windows Mobile devices
答案 1 :(得分:2)
正确的方法是这样的:
def extractText(nodes: Seq[xml.Node]): Seq[String] = nodes.flatMap {
case xml.Text(t) => Seq(t)
case n => extractText(n.child)
}
然后你可以做
extractText(xml.XML.loadString(xmlToParse))
.filter(_.matches(".*\\S.*"))
.mkString("\n")
正则表达式,正如另一个答案所暗示的那样(你不需要用反斜杠BTW转义<
和>
,而且\s
是一个元字符,你可以使用而不是枚举所有可能的空白符号),是一个更简单的解决方案,大部分时间都可以工作,但在某些极端情况下可以分解。
对于纯粹主义者来说,这里也是一个尾递归版本(特别是如果你的文档结构非常真实,那就很有帮助:))
@tailrec
def extractText(nodes: Seq[xml.Node], result: List[String] = Nil): Seq[String] = nodes match {
case Seq() => result.reverse
case Seq(xml.Text(t), tail@_*) => extractText(tail, t :: result)
case Seq(head, tail@_*) => extractText(head.child ++ tail, result)
}
答案 2 :(得分:0)
获取此元素及其所有子元素的组合文本。空格被标准化和修剪。 例如,给定HTML
<p>Hello <b>there</b> now! </p>
,p.text()
会返回"Hello there now!"
String s = //..html code
System.out.println(Jsoup.parse(s).text());