如何使用java / Scala从xml文件中删除所有标记?

时间:2017-05-20 12:49:05

标签: java xml scala jsoup

我的内容为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
  

我对任何其他方法/图书馆建议持开放态度?

3 个答案:

答案 0 :(得分:2)

如果您可以将xml文件的所有内容都作为字符串获取,我会建议这样:
您可以将replaceAll与正则表达式\<.*?\>一起使用,如下所示:

str.replaceAll("\\<.*?\\>", "")

替换您可以使用的所有空行:

str.replaceAll("(?m)^[ \t]*\r?\n", "")

您可以在remove all empty lines

查看此内容

最后的输出应该如下:

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)

使用Jsoup#text

  

获取此元素及其所有子元素的组合文本。空格被标准化和修剪。   例如,给定HTML <p>Hello <b>there</b> now! </p>p.text()会返回"Hello there now!"

String s = //..html code
System.out.println(Jsoup.parse(s).text());