Используя Scala, как можно отличить элементы XML, имеющие элементы как дочерние элементы или имеющие текст? - PullRequest
1 голос
/ 14 ноября 2009

Я анализирую некоторые xml и, учитывая конкретный узел, я пытаюсь выяснить, какой из них это:

  • Элемент с вложенными элементами

    Foobar

  • Элемент с текстом / данными в нем

    Foobar

Я пытался проверить длину Node.text, но Node.text возвращает "foobar" для theElement в обоих приведенных выше примерах.

Мой код повторяется через структуру XML, и в каждой точке необходимо знать, достиг ли он некоторого текста / данных или есть ли другие элементы ниже.

Ответы [ 2 ]

5 голосов
/ 14 ноября 2009
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 голосов
/ 14 ноября 2009

Может быть, это решение, опробовал его в repl:

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

, например

if ( node.child.first.label == "#PCDATA" ) {
  // Its got data in it
} else {
  // Its got elements below it
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...