Scala XML使用Attributes匹配节点

时间:2013-04-20 04:02:49

标签: xml scala parsing match

我在scala中加载XML文件,如下所示:

<dataset>
  <item label="neutral" target="general" tweetid="936466790" username="B_E_X">
    <content>Jim Lehrer just directed the debate audience ... 30 seconds ... #tweetdebate</content>
  </item>
  <item label="neutral" target="general" tweetid="936466992" username="Jonathan Fields">
    <content>Here we go. #tweetdebate</content>
  </item>
</dataset>

现在,我正在尝试使用属性获取每个项目的标签,但它总是返回我没有?我尝试了几种匹配,解析等方式:

val rawXML = XML.loadFile(file).toList
rawXML.foreach(x => println(x.attribute("label")))

我也尝试过匹配如下:

myXML match { 
    case <dataset>
    {item @ <item>{theText}</item>}
    </dataset> => 
    println("An %s text: %s".format(item \ "@label", theText))

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。您的第一个版本的问题是您没有在子节点中搜索“label”:

//Note the three whitespace nodes
scala> rawXML.child.foreach(x => println(x.attribute("label")))
None
Some(neutral)
None
Some(neutral)
None

您可以使用“label”属性对“item”的所有子节点进行更精确的搜索:

scala> rawXML \ "item" \\ "@label"
res0: scala.xml.NodeSeq = NodeSeq(neutral, neutral)

如果您在scala中使用xml做了很多工作,那么我建议使用Anti-XML。与scala的本机xml处理相比,它为您提供了更好的语法和性能改进(大部分)。