如何在scala中解析以下XML格式

时间:2018-02-19 04:59:18

标签: xml scala

<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)那样将特定的标签输出作为一对。

3 个答案:

答案 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