Пример обработки XML, но с использованием анти-XML вместо Scala XML - PullRequest
11 голосов
/ 05 августа 2011

Я хотел бы увидеть переписанный ниже скрипт, использующий http://anti -xml.org вместо Scala XML.

Это отрывок из главы 10. Стадное XML в Scala - http://ofps.oreilly.com/titles/9780596155957/HerdingXMLInScalaDSLs.html

// code-examples/XML/reading/pattern-matching-script.scala
import scala.xml._
val someXML =
 <sammich>
   <bread>wheat</bread>
   <meat>salami</meat>
   <condiments>
     <condiment expired="true">mayo</condiment>
     <condiment expired="false">mustard</condiment>
   </condiments>
</sammich>

someXML match {
 case <sammich>{ingredients @ _*}</sammich> => {
    for (cond @ <condiments>{_*}</condiments> <- ingredients)
      println("condiments: " + cond.text)
    }
}

Спасибо

1 Ответ

6 голосов
/ 06 августа 2011

Я не знаком с antixml, однако, поскольку другого ответа нет, я попробую

Только для записи, ваш код возвращает

  mayo
  mustard

Точнее, строка начинается с пробела / новой строки между концом и началом первого. Пробелы между майонезом и горчицей - те, что находятся между двумя приправами, а пробелы после горчицы - те, что перед закрытием.

В antixml первое, что нужно сделать, это преобразовать ваше, что просто

val someAntiXml = someXML.anti

Получить часть приправы легко:

var condiments = someAntiXml \ 'condiments

Затем нужно извлечь текст. Похоже, что способ сделать это был

condiments \\ text

Но \\ не пересекает структуру по порядку, он выглядит как обход в ширину. Как следствие, пробелы, которые находятся только под приправами, предшествуют майо и горчице, которые на один уровень ниже, в элементах.

Итак, вот возможная реализация для извлечения текста. Может быть, есть более стандартный способ, но я не нашел его.

def textOf(g: Group[Node]) : String = 
  g.toList.map{
    case Elem(_, _, _, _, children) => textOf(children) 
    case t: Text => t.text
    case c: CDATA => c.text 
    case _ => ""
  }.mkString

Тогда textOf(someAntiXml \ "condiments") дает ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...