加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Scala进行XML解析:相当于JS中的“getElementByTagName(name

发布时间:2020-12-16 18:10:59 所属栏目:安全 来源:网络整理
导读:Scala中的XML解析似乎并不像应该的那样容易和直接. 我需要的是与JavaScript中的document.getElementsByTagName(name)类似的东西,但出于我的目的,我所需要的只是特定标记名的第一个元素.这是我最终得到的: import scala.xml.{Document,Elem,Node}import scal
Scala中的XML解析似乎并不像应该的那样容易和直接.

我需要的是与JavaScript中的document.getElementsByTagName(name)类似的东西,但出于我的目的,我所需要的只是特定标记名的第一个元素.这是我最终得到的:

import scala.xml.{Document,Elem,Node}
import scala.xml.parsing.ConstructingParser
def _getFirstMatchingElementByName(search: String,n: Node): Option[Node] = {
    if (n.label == search) {
        Some(n)
    } else {
        var i = 0
        var result: Option[Node] = None
        try {
            while (result == None) {
                result = _getFirstMatchingElementByName(search,n.child(i))
                i += 1
            }
        } catch {
            case e: IndexOutOfBoundsException => None
        }
        result
    }
}

它基本上都会一直进行,直到找到匹配或所有可能性都用完为止.

既然已经发布了我具备此功能所需的功能,我已经对此进行了更多评论,这真的让我感到困惑.我确信有许多Java库可用于帮助解析XML,但考虑到Scala用于生成XML的原生支持(即它几乎可以在任何地方进行内联),我很好奇我是否遗漏了某些内容.

在Scala中有更好的方法吗?

解决方法

你做错了!
我需要的只是特定标记名称的第一个元素
给出这个xml:

val page = 
  <root>
    <need>text1</need>
    <doesnotneed>text2</doesnotneed>
    <doesnotneed>text3</doesnotneed>
    <need>text4</need>
  </root>

现在调用此代码将为您提供具有给定标记名称的所有节点的列表:

scala> page  "need"
res3: scala.xml.NodeSeq = NodeSeq(<need>text1</need>,<need>text4</need>)

只获得第一个:

scala> page  "need" head
res4: scala.xml.Node = <need>text1</need>

附:深度第一元素将被视为头部.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读