2011-08-05 9 views
11

Chciałbym zobaczyć przepisanie poniższego skryptu przy użyciu http://anti-xml.org zamiast Scala XML.Przykład przetwarzania xml, ale z użyciem anty-xml zamiast Scala xml

Jest to fragment z rozdziału 10. pasterski XML w 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) 
    } 
} 

Dzięki

Odpowiedz

6

nie jestem zaznajomiony z antixml jednak, ponieważ nie ma innej odpowiedzi, będę dokonać próby

Tylko dla przypomnienia, kod zwraca

mayo 
    mustard 

Dokładniej, ciąg rozpoczyna się od pustych/nowych linii między końcem i początkiem pierwszego. Półki pomiędzy majonezem i musztardą to te między dwoma przyprawami, a półfabrykaty po musztardzie to te przed zamknięciem.

W antixml, pierwszą rzeczą do zrobienia wydaje się konwertować, który jest po prostu

val someAntiXml = someXML.anti 

Getting część przyprawy jest proste:

var condiments = someAntiXml \ 'condiments 

Następnie trzeba wyodrębnić tekst. Brzmiało to jak sposób to zrobić był

condiments \\ text 

Ale \\ nie przechodzić strukturę w porządku, wygląda wszerz przechodzenia. W konsekwencji, półfabrykaty, które są tuż pod przyprawami, występują przed elementami majonezu i musztardy, które znajdują się jeden poziom niżej.

Oto możliwa implementacja do pobrania tekstu. Może istnieje bardziej standardowy sposób, ale go nie znalazłem.

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 

Następnie textOf(someAntiXml \ "condiments") daje oczekiwany wynik.

+0

Trochę za późno, ale ... dzięki! – Rodolfo

+2

W anti-xml 0.3 i nowszych, [\\ przemierza w pierwszym rzędzie] (https://github.com/djspiewak/anti-xml/issues/49), więc "condiments \\ text" teraz działa dobrze . – Steve

Powiązane problemy