所以,我正在开发一个可以接收多种XML请求的项目。请求的类型由根标记的第一个子项确定。所以你可以得到这样的东西:
<a>
<b>
foo
</b>
</a>
或:
<a>
<c>
foo
</c>
</a>
根据foo
的第一个孩子是<a>
还是<b>
,对<c>
执行某项操作。我无法弄清楚任何简单的方法来确定第一个孩子。我想我可以做重复匹配,首先检查a \ 'b'
然后检查a \ 'c'
等等。但是我需要处理一堆不同的请求类型,所以这会很快变得笨拙。 Elem.child
没有帮助,它只返回一个元素列表:元素本身。
如何在不事先知道标签名称的情况下获取Element的第一个子节点?
答案 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)
...
}