2017-01-30 102 views
0

這是代碼的樣子無法從XML解析ELEM斯卡拉

import scala.xml.{Elem, Node, PCData} 
import scala.xml.transform.{RewriteRule, RuleTransformer} 

val doc: Elem = <data> 
    <level1> 
     <Weekly> 
     <Properties> 
      <Property key="Sun"/> 
      <Property key="Mon"/> 
      <Property key="Tue"/> 
     </Properties> 
     </Weekly> 
    </level1> 
    <level2> 
     <Monthly> 
     <Properties> 
      <Property key="Jan"/> 
      <Property key="Feb"/> 
      <Property key="Mar"/> 
     </Properties> 
     </Monthly> 
    </level2> 
    </data> 

final class traverseRule extends RewriteRule { 
    override def transform(ns: Seq[Node]): Seq[Node] = ns match { 
    case n: Node => println(n.label) 
     n 

    } 
} 
new RuleTransformer(new traverseRule()).transform(doc).head 

我會得到什麼是

#PCDATA 
#PCDATA 
#PCDATA 
#PCDATA 
Property 
#PCDATA 
Property 
#PCDATA 
Property 
#PCDATA 
Properties 
#PCDATA 
Weekly 
#PCDATA 
level1 
#PCDATA 
#PCDATA 
#PCDATA 
#PCDATA 
Property 
#PCDATA 
Property 
#PCDATA 
Property 
#PCDATA 
Properties 
#PCDATA 
Monthly 
#PCDATA 
level2 
#PCDATA 
data 

需要的?
我需要元素datalevel,Weekly而不是#PCDATA。我怎樣才能做到這一點?

感謝

回答

0

如果你想列出XML文檔下面的函數將工作中的所有元素。

import scala.xml.{Elem, Node, PCData} 

val doc: Elem = <data> 
    <level1> 
     <Weekly> 
     <Properties> 
      <Property key="Sun"/> 
      <Property key="Mon"/> 
      <Property key="Tue"/> 
     </Properties> 
     </Weekly> 
    </level1> 
    <level2> 
     <Monthly> 
     <Properties> 
      <Property key="Jan"/> 
      <Property key="Feb"/> 
      <Property key="Mar"/> 
     </Properties> 
     </Monthly> 
    </level2> 
    </data> 


def listNodes(elem: scala.xml.Elem): Seq[scala.xml.Elem] = { 
    elem.child flatMap { 
     case x: scala.xml.Elem => x +: listNodes(x) 
     case _ => Nil 
    } 
} 

val elements = doc +: listNodes(doc) 

scala> elements.map(_.label) 
res0: Seq[String] = ArrayBuffer(data, level1, Weekly, Properties, Property, Property, Property, level2, Monthly, Properties, Property, Property, Property) 

這些元素是具有文檔中所有元素標記的Scala元素的順序。函數listNodes函數遞歸地查找XML節點中的所有元素節點。