scala - 在 Scala 中,如何获取 XML 节点的文本而不获取其子节点的文本?

标签 scala xml-parsing

我有一个 XML 文件,其中有一个始终包含文本的特定节点,并且也可能有或没有子节点。在 Scala 中阅读后,Node 元素可能看起来像其中之一:

val nodeWithChild = <cell colorbg="16777215">
              independent
              <grid>
            <row>
              <cell colorbg="16777215">
                exclusively
              </cell>
            </row>
              </grid>
            </cell>
val nodeWithoutChild = <cell colorbg="16777215">
              dependent
            </cell>

现在我想获取父节点的文本。我希望 text 方法能够将其提供给我。

scala> nodeWithChild.text
res0: String = 
"
              independent



                exclusively



            "

scala> nodeWithoutChild.text
res1: String = 
"
              dependent
            "

去掉空格是没有问题的。但问题是,在第一种情况下,我不希望结果中出现“独占”一词。我只想要一个读取独立的结果。

我怎样才能看到这段文字?

最佳答案

您可以使用 Elemchild 方法获取其子级(而不是其其余后代),然后 collect (或 filterflatMap 等)仅选择文本节点:

scala> val texts = nodeWithChild.child.collect { case Text(t) => t }
texts: Seq[String] = 
ArrayBuffer("
              independent
              ", "
            ")

如果你想忽略空格:

scala> texts.map(_.trim).filterNot(_.isEmpty)
res3: Seq[String] = ArrayBuffer(independent)

您还可以通过在案例中添加诸如 if t.trim.nonEmpty 之类的内容,在与文本节点选择相同的过程中执行此过滤。

关于scala - 在 Scala 中,如何获取 XML 节点的文本而不获取其子节点的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19875569/

相关文章:

sql-server - Spark dense_rank 窗口函数 - 没有 partitionBy 子句

delphi - libxml2 xmlParseFile无法加载格式正确的XML

Java:如何防止 EntityResolver#resolveEntity(String publicId, String systemId) 中的 'systemId' 被绝对化到当前工作目录

sockets - Akka IO.TCP 与 Json

scala - 是否可以使用 Mockito 和 Specs2 模拟具有 View 边界的 Scala 方法?

scala - 在 Spark 中将 sqlContext 作为隐式参数传递

regex - 从带有类型的字符串中提取 url

c++ - XML 解析器 - 数据绑定(bind) C++ 生成器

java - 将 XML 转换为 JSON,与 FasterXML 一起使用的 jaxb 类出现问题

php - 在 php 中解析非常大的 XML 文件