#xml #scala
#xml #scala
Вопрос:
Рассмотрим следующий XML :
val someXML =
<sammich>
<bread>wheat</bread>
<meat>salami</meat>
<extras></extras>
<condiments>
<condiment expired="true">mayo</condiment>
<condiment expired="false">mustard</condiment>
</condiments>
</sammich>
Я хочу выяснить, у какого элемента нет подэлементов, как, например, в приведенном выше XML, этот элемент был бы дополнительным. Метод длины NodeSeq возвращает 1 для дополнительных функций, а isEmpty возвращает false . Итак, как мы можем протестировать такие элементы, у которых нет никаких подэлементов или значения?
Пожалуйста, помогите, спасибо
Ответ №1:
Узлы представляют собой списки длиной 1, содержащие самих себя. Дочерние элементы могут быть получены с помощью descendant
, если вы спросите
someXML.descendant(7).descendant.length
вы получите 0 (в вашем примере <extras></extras>
находится в позиции 7 (поскольку новые строки пробелы считаются текстовыми объектами). Вы также можете захотеть подсчитать атрибуты, а можете и не захотеть:
someXML.descendant(7).attributes.length
Ответ №2:
Я просто добавлю немного к ответу Rex. Обратите внимание, что descendant
метод включает комментарии и инструкции по обработке. Предполагая, что вы хотите подсчитать только подэлементы и текстовые узлы, вам придется проделать немного больше работы:
def isNodeEmpty(n: Node) =
n.descendant collect { case c @ (_: Text | _: Elem) => c } isEmpty