【问题标题】:How to remove all tag from xml file using java/Scala?如何使用 java/Scala 从 xml 文件中删除所有标签?
【发布时间】:2017-05-20 12:49:04
【问题描述】:

我有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-tree 并在 java/scala.xml 中一一删除每个标签的情况下从 xml 上方获取文本。我遇到了this,但这是删除不必要的标签而不是删除所有标签?我正在寻找一些通用的解决方案,它可以删除所有标签或从 xml 中获取所有文本。

所需输出:

Highlighted Applications
Projects
Description
VNC login for Windows Mobile devices

我愿意接受任何其他方法/库建议?

【问题讨论】:

    标签: java xml scala jsoup


    【解决方案1】:

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

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

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

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

    你可以在这里查看remove all empty lines


    最后的输出应该是这样的:

    Highlighted Applications
    Projects 
    Description
    VNC login for Windows Mobile devices
    

    【讨论】:

    • 天啊!乍一看,我认为它不适用于自定义标签,但经过测试,它就像一个魅力。难以置信的!正则表达式,你长寿。 @YCF_L,非常感谢朋友。你拯救了我的一天。
    • &lt;foo&gt;&lt;![CDATA[this text will be gone!]]&gt;&lt;/foo&gt; 呢?
    • 是的@Dima我根据OP分享的例子回答,你有什么想法:)?
    • 我愿意...给我一点时间。
    • @YCF_L 刚刚添加了我的想法作为另一个答案
    【解决方案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")
    

    正则表达式,正如另一个答案所暗示的(你不需要用反斜杠转义 &lt; 和 &gt; 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)
    }
    

    【讨论】:

      【解决方案3】:

      使用Jsoup#text

      获取此元素及其所有子元素的组合文本。空白被规范化和修剪。 例如,给定 HTML &lt;p&gt;Hello &lt;b&gt;there&lt;/b&gt; now! &lt;/p&gt;,p.text() 返回 "Hello there now!"

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

      【讨论】:

      • 它给了我一行中的所有文本,没有换行符。是否可以获取带有换行信息的文本?
      • @OmPrakash 是的,您想要实现的目标不能简单地做到这一点。一个正则表达式可以在这里工作,但认为你把所有的 html 放在一行中,那么正则表达式也会失败。在这种情况下,您必须逐个元素地进行。但是,如果您知道 html 格式正确,则应从 YCF_L 中选择答案
      猜你喜欢
      • 2020-09-02
      • 2016-07-31
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多