<nv n="1" v ="a"/><nv n="2" v ="b"/><nv n="3" v ="c"/><nv n="4" v ="d"/>
output:
(4,d)
我是scala的新手,我正在尝试解析XML文件。我有上面的xml格式。我需要像(4,d)那样将特定的标签输出作为一对。
答案 0 :(得分:0)
您可以将多个XML元素声明为NodeSeq
:
val xml: scala.xml.NodeSeq = <nv n="1" v ="a"/><nv n="2" v ="b"/><nv n="3" v ="c"/><nv n="4" v ="d"/>
您可以将该XML转换为以下对:
scala> val pairs = for { nv <- xml } yield { nv\@"n" -> nv\@"v" }
pairs: Seq[(String, String)] = List((1,a), (2,b), (3,c), (4,d))
您的XML有可能位于根元素中,如下所示:
val xml: scala.xml.NodeSeq = <root>
<nv n="1" v ="a"/>
<nv n="2" v ="b"/>
<nv n="3" v ="c"/>
<nv n="4" v ="d"/>
</root>
如果文件位于根元素中,则按原样获取:
scala> val pairs = for { nv <- xml \ "nv" } yield { nv\@"n" -> nv\@"v" }
pairs: Seq[(String, String)] = List((1,a), (2,b), (3,c), (4,d))
如果您写信阅读XML文件,请使用:
val xml: Elem = scala.xml.XML.loadFile("nv.xml")
答案 1 :(得分:-1)
您可以通过以下方式执行此操作。要了解它refer
scala> val xml = <nv n="1" v ="a"/><nv n="2" v ="b"/><nv n="3" v ="c"/><nv n="4" v ="d"/>
xml: scala.xml.NodeBuffer = ArrayBuffer(<nv n="1" v="a"/>, <nv n="2" v="b"/>, <nv n="3" v="c"/>, <nv n="4" v="d"/>)
scala> val lastElement = (xml \\ "nv").last
lastElement: scala.xml.Node = <nv n="4" v="d"/>
scala> (lastElement \ "@n", lastElement \ "@v")
res24: (scala.xml.NodeSeq, scala.xml.NodeSeq) = (4,d)
答案 2 :(得分:-1)
您可以使用E
从文件加载xml并根据需要访问节点。
将输入指定为字符串xml(我添加了节点,因为您的示例没有根节点),
scala.xml.XML
加载xml字符串
scala> val xmlData = """<root><nv n="1" v ="a"/><nv n="2" v ="b"/><nv n="3" v ="c"/><nv n="4" v ="d"/></root>"""
xmlData: String = <root><nv n="1" v ="a"/><nv n="2" v ="b"/><nv n="3" v ="c"/><nv n="4" v ="d"/></root>
现在,由于scala> val xmlNodes = scala.xml.XML.loadString(xmlData)
xmlNodes: scala.xml.Elem = <root><nv v="a" n="1"/><nv v="b" n="2"/><nv v="c" n="3"/><nv v="d" n="4"/></root>
是根节点的子节点,因此获取最后一个子节点
<nv>
然后访问scala> val nodeIwant = xmlNodes.child.last
nodeIwant: scala.xml.Node = <nv v="d" n="4"/>
,它会为您提供attribute
,
Option(result)
您可以使用scala> (nodeIwant.attribute("v"), nodeIwant.attribute("n"))
res1: (Option[Seq[scala.xml.Node]], Option[Seq[scala.xml.Node]]) = (Some(d),Some(4))
来获取值,
.attributes