Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 选择scala中节点的所有子元素_Xml_Scala_Scala Xml - Fatal编程技术网

Xml 选择scala中节点的所有子元素

Xml 选择scala中节点的所有子元素,xml,scala,scala-xml,Xml,Scala,Scala Xml,我想选择名为“a”的节点的第一个子元素。我现在得到的是: (xml \ "a")(0).child.collect {case e: Elem => e} 这太冗长了。我在寻找类似的东西: xml \ "a" \ "*" 这在scala中是可能的吗?您不能使用NodeSeq上现有的\或\方法执行任何操作。 但是,您可以按照pimp your library模式,使用新的\*方法扩展NodeSeq(注意缺少或空格字符): import xml.{NodeSeq, Elem} class

我想选择名为“a”的节点的第一个子元素。我现在得到的是:

(xml \ "a")(0).child.collect {case e: Elem => e}
这太冗长了。我在寻找类似的东西:

xml \ "a" \ "*"

这在scala中是可能的吗?

您不能使用
NodeSeq
上现有的
\
\
方法执行任何操作。 但是,您可以按照pimp your library模式,使用新的
\*
方法扩展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)
scala>val xml=xxx
xml:scala.xml.Elem=xxx
scala>xml\*
res7:scala.xml.NodeSeq=NodeSeq(xxx)
scala>xml\“b”\*
res8:scala.xml.NodeSeq=NodeSeq(xxx)
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
导入scala.xml.Elem
val xml=HI
println(xml)
println(xml\“\”)
println(xml \“b”)
println(xml\“b”\“\”)
println(xml\“b”\“c”)
println(xml\“b”\“c”\“\”)
你好
你好
你好
你好
你好
//空的

这比公认的答案要好<代码>“\u”完全按照要求执行,无需编写新方法。要维护的代码越少,让下一个看你的代码的人感到困惑的非标准语法就越少。不要高估这一点。scala xml已损坏。使用类似于或@guillaumassé的词,你能解释一下“scala xml被破坏了”是什么意思吗。我开始学习“scala xml”。@Mukeshprajapati明白了