2013-06-13 10 views
9

Ho un codice XML generato con Scala incorporato, ma non inserisce l'XML generato su righe separate.Generazione di XML formattato in Scala

Attualmente, sembra che questo,

<book id="0"> 
     <author>Gambardella, Matthew</author><publish_date>Sun Oct 01 00:00:00 EDT 2000</publish_date><description>An in-depth loo 
k at creating applications with XML.</description><price>44.95</price><genre>Computer</genre><title>XML Developer's Guide</title> 
    </book> 

ma voglio farlo sembrare come questo:

<book id="0"> 
    <author>Gambardella, Matthew</author> 
    <publish_date>Sun Oct 01 00:00:00 EDT 2000</publish_date> 
    <description>An in-depth look at creating applications with XML.</description> 
    <price>44.95</price> 
    <genre>Computer</genre> 
    <title>XML Developer's Guide</title> 
</book> 

Come posso controllare la formattazione? Qui è il codice che genera il codice XML

<book id="0"> 
    { keys map (_.toXML) } 
</book> 

qui è toxml:

def toXML:Node = XML.loadString(String.format("<%s>%s</%s>", tag, value.toString, tag)) 
+0

Possibile duplicato di [Come produrre codice XML ben formattato in Scala?] (Http://stackoverflow.com/questions/3364627/how-to-produce-nicely-formatted-xml -in-scala) – Suma

risposta

17

Utilizzare un PrettyPrinter:

val xml = // your XML 

// max width: 80 chars 
// indent:  2 spaces 
val printer = new scala.xml.PrettyPrinter(80, 2) 

printer.format(xml) 

A proposito, si potrebbe prendere in considerazione la sostituzione del toXML con:

def toXML: Node = Elem(null, tag, Null, TopScope, Text(value.toString)) 

Questo è probabilmente più veloce e rimuove tutti i tipi di problemi di escape. (Cosa succede se value.toString valuta </a>?)

+0

Grazie! Molte buone informazioni – tsjnsn

+0

Esiste un'alternativa a 'PrettyPrint' che restituisce un' Nodo XML 'piuttosto che un 'String'? Mi piacerebbe poter "stampare" il nodo formattato direttamente senza prima usare la prettyprinter. In questo momento sto costruendo il nodo, facendo una bella stampa, e poi analizzando di nuovo il nodo 'XML.loadString (prettyPrinter format xml)' Non sembra molto efficiente. – tsjnsn

+0

@tsjnsn Capisco cosa intendi. Apparentemente 'XML.loadString' conserva spazi non significativi. Questo non è un comportamento richiesto per un parser XML (vedi http://www.w3.org/TR/xml/#sec-white-space) a meno che non sia specificato nel documento stesso (e quindi potrebbe cambiare in futuro). Vi consiglio di usare 'PrettyPrinter' solo quando avrete effettivamente bisogno di un' String'. – gzm0