2011-08-05 16 views
11

Me gustaría ver una reescritura de guiones de abajo usando http://anti-xml.org en lugar de Scala XML.Un ejemplo de procesamiento xml pero usando anti-xml en lugar de Scala xml

Este es un extracto del capítulo 10. XML que reúne en 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) 
    } 
} 

Gracias

Respuesta

6

No estoy familiarizado con antixml, sin embargo, ya que no hay otra respuesta, me quedo hacer un intento

Sólo para el registro, el código devuelve

mayo 
    mustard 

Más precisamente, la cadena comienza con los espacios en blanco/línea nueva entre el final y el comienzo de la primera. Los espacios entre mayonesa y mostaza son los que están entre los dos condimentos, y los espacios en blanco después de la mostaza son los que se encuentran antes del cierre.

En antixml, primero que hay que hacer parece convertir su, que es simplemente

val someAntiXml = someXML.anti 

Conseguir la parte condimentos es fácil:

var condiments = someAntiXml \ 'condiments 

Entonces uno tiene que extraer el texto. Sonaba como la manera de hacer esto era

condiments \\ text 

Pero \\ no atraviesa la estructura con el fin, parece que el recorrido primero en amplitud. Como consecuencia, los espacios en blanco, que están justo debajo de los condimentos, vienen antes de la mayonesa y la mostaza, que están un nivel más abajo, en los elementos.

Así que aquí hay una posible implementación para recuperar el texto. Tal vez hay una forma más estándar, pero no encontré ninguna.

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 

Luego textOf(someAntiXml \ "condiments") da el resultado esperado.

+0

Un poco tarde pero ... ¡gracias! – Rodolfo

+2

En anti-xml 0.3 y posterior, [\\ sí atraviesa en primer orden] (https://github.com/djspiewak/anti-xml/issues/49), así 'condiments \\ text' ahora funciona bien . – Steve

Cuestiones relacionadas