Поиск XML-элементов, у которых нет подэлементов или значения в scala

#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