"a"라는 노드의 첫 번째 자식 Elem을 선택하고 싶습니다. 내가 지금 얻은 것은 :노드의 모든 하위 요소를 스칼라로 선택하십시오.
(xml \ "a")(0).child.collect {case e: Elem => e}
이것은 매우 장황하다. 저는 다음과 같은 것을 찾고있었습니다 :
xml \ "a" \ "*"
scala로 가능합니까?
"a"라는 노드의 첫 번째 자식 Elem을 선택하고 싶습니다. 내가 지금 얻은 것은 :노드의 모든 하위 요소를 스칼라로 선택하십시오.
(xml \ "a")(0).child.collect {case e: Elem => e}
이것은 매우 장황하다. 저는 다음과 같은 것을 찾고있었습니다 :
xml \ "a" \ "*"
scala로 가능합니까?
에있는 기존 \
또는 \\
방법으로는 아무 것도 할 수 없습니다. 하지만 포주 - 네 - 라이브러리 패턴에 따라, 새로운 \*
방법 (주 부족 또는 공백 문자)와 NodeSeq을 확장 할 수 있습니다 :
import xml.{NodeSeq, Elem}
class ChildSelectable(ns: NodeSeq) {
def \* = ns flatMap { _ match {
case e:Elem => e.child
case _ => NodeSeq.Empty
} }
}
implicit def nodeSeqIsChildSelectable(xml: NodeSeq) = new ChildSelectable(xml)
REPL에서,이는 저를 제공합니다 :
scala> val xml = <a><b><c>xxx</c></b></a>
xml: scala.xml.Elem = <a><b><c>xxx</c></b></a>
scala> xml \*
res7: scala.xml.NodeSeq = NodeSeq(<b><c>xxx</c></b>)
scala> xml \ "b" \*
res8: scala.xml.NodeSeq = NodeSeq(<c>xxx</c>)
scala> xml \ "b" \ "c" \*
res9: scala.xml.NodeSeq = NodeSeq(xxx)
이 꽤 가까이 당신이 찾고있는 것을 :
import scala.xml.Elem
val xml = <a><b><c>HI</c></b></a>
println(xml)
println(xml \ "_")
println(xml \ "b")
println(xml \ "b" \ "_")
println(xml \ "b" \ "c")
println(xml \ "b" \ "c" \ "_")
<a><b><c>HI</c></b></a>
<b><c>HI</c></b>
<b><c>HI</c></b>
<c>HI</c>
<c>HI</c>
// Empty
목 이 대답보다 낫다. ''_ ''은 새로운 방법을 쓸 필요없이 정확히 요구 한 것을 수행합니다. 코드를 유지하는 코드가 줄어들고 코드를 보는 다음 사람을 혼란스럽게하는 비표준 구문이 줄어 듭니다. – rumtscho
이 awnser을 과대 평가하지 마십시오. scala-xml이 깨졌습니다. https://github.com/lihaoyi/scalatags 또는 https://github.com/chris-twiner/scalesXml과 같은 것을 사용하십시오. –