2009-11-13 4 views
1

Je suis un peu l'analyse syntaxique xml, et donné un nœud particulier, je suis en train de comprendre que l'un de ces est:En utilisant Scala, comment différencier les éléments XML ayant des éléments en tant qu'enfants ou ayant du texte?

  • Un élément avec des éléments imbriqués

    <theElement> <nestedElement> foobar </nestedElement > </theElement >

  • Un élément avec le texte/données dans ce

    <theElement> foobar </theElement >

J'ai essayé de vérifier la longueur de Node.text, mais Node.text retourne "foobar" pour theElement dans les deux exemples ci-dessus.

Mon code est récursif vers le bas à travers une structure XML, et à chaque point doit savoir s'il a atteint du texte/données, ou s'il y a plus d'éléments ci-dessous.

Répondre

5
def textChildren(xml: Node) = xml match { 
    case Elem(prefix, label, attribs, scope, Text(text)) => println("Only text children: "+text) 
    case _ => println("Other kinds of children") 
} 

scala> textChildren(<a>XML example</a>) 
Only text children: XML example 

scala> textChildren(<a><nested>XML example</nested></a>) 
Other kinds of children 

scala> textChildren(<a>Text with <nested>XML</nested> example</a>) 
Other kinds of children 
+0

thx, qui fonctionne bien. Pourriez-vous aussi faire xml.Child match {case Text (text) => case _ =>}? –

+1

La méthode retourne un 'Seq [Node]', donc vous aurez probablement besoin d'écrire 'case Seq (Text (text)) =>' à la place. –

0

Peut-être est la solution, il a essayé en rempl:

scala> val xml1 = <theElement><nestedElement>foobar</nestedElement></theElement> 
xml1: scala.xml.Elem = <theElement><nestedElement>foobar</nestedElement></theElement> 

scala> val xml2 = <theElement>foobar</theElement> 
xml2: scala.xml.Elem = <theElement>foobar</theElement> 

scala> xml1.child.first.label 
res0: String = nestedElement 

scala> xml2.child.first.label 
res1: String = #PCDATA 

par exemple

if (node.child.first.label == "#PCDATA") { 
    // Its got data in it 
} else { 
    // Its got elements below it 
} 
Questions connexes