在Scala中查找XML Elem的第一个子节点

时间:2013-09-18 19:30:04

标签: xml scala

所以,我正在开发一个可以接收多种XML请求的项目。请求的类型由根标记的第一个子项确定。所以你可以得到这样的东西:

<a>
  <b>
    foo
  </b>
</a>

或:

<a>
  <c>
    foo 
  </c>
</a>

根据foo的第一个孩子是<a>还是<b>,对<c>执行某项操作。我无法弄清楚任何简单的方法来确定第一个孩子。我想我可以做重复匹配,首先检查a \ 'b'然后检查a \ 'c'等等。但是我需要处理一堆不同的请求类型,所以这会很快变得笨拙。 Elem.child没有帮助,它只返回一个元素列表:元素本身。

如何在不事先知道标签名称的情况下获取Element的第一个子节点?

2 个答案:

答案 0 :(得分:4)

我想你可以尝试类似的东西:

val firstChildName = xml.child.collect{
  case el:Elem => el.label
}.headOption getOrElse ""

如果根有一个子标签,你将获得第一个元素子标签,否则你将获得一个空字符串

答案 1 :(得分:2)

您可以在“_”上提取以忽略第一个节点的名称,因此这应该有效:

val firstChild = (theXML \ "_").head //can do headOption here and map if there's a possibility of no child existing
firstChild.label match {
   case "a" => someOp(firstChild.text)
   case "b" => someOtherOp(firstChild.text)
...
}