21 votos

Cómo producir muy bien con formato XML en la Scala?

Dicen que definir los siguientes:

class Person(name: String, age: Int) {
    def toXml =
        <person>
            <name>{ name }</name>
            <age>{ age }</age>
        </person>   
}

val Persons = List(new Person("John", 34), new Person("Bob", 45))

A continuación, generar algo de XML y guardarlo en un archivo:

val personsXml = 
    <persons>
        { persons.map(_.toXml) }
    </persons>

scala.xml.XML.save("persons.xml", personsXml)

Se termina con las siguientes divertido mirando texto:

<persons>
        <person>
            <name>John</name>
            <age>32</age>
        </person><person>
            <name>Bob</name>
            <age>43</age>
        </person>
    </persons>

Ahora, por supuesto, esto es perfectamente válido XML, pero si usted quiere ser humano-editable de un buen editor de texto, sería preferible tener formato un poco más agradable.

Cambiando de sangría en diversos puntos de la Scala XML literales - de hacer que el código de aspecto menos agradable - es posible generar variaciones de la anterior salida, pero parece imposible conseguirlo del todo bien. Entiendo por qué se convierte en un formato de este modo, pero pregunto si hay alguna manera de trabajar alrededor de ella.

21voto

Moritz Puntos 9149

Usted puede utilizar scala.xml.PrettyPrinter para darle formato. Lamentablemente esto no funciona para documentos de gran tamaño, como solo los formatos en un StringBuilder y no escribe directamente en una secuencia o un escritor.

14voto

Josh Yeager Puntos 139

Yo no podía encontrar una manera de utilizar el PrettyPrinter y también especificar la codificación de archivo directamente. La "solución" que he encontrado es este:

val Encoding = "UTF-8"

def save(node: Node, fileName: String) = {

    val pp = new PrettyPrinter(80, 2)
    val fos = new FileOutputStream(fileName)
    val writer = Channels.newWriter(fos.getChannel(), Encoding)

    try {
        writer.write("<?xml version='1.0' encoding='" + Encoding + "'?>\n")
        writer.write(pp.format(node))
    } finally {
        writer.close()
    }

    fileName
}

2voto

hel Puntos 56

Gracias por la idea de "PrettyPrinter". Eso me ayudó mucho.

Me enteré de esta forma de escribir los elementos XML a un archivo con la debida guión.

val xmlData = // your xml here

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

XML.save("yourFileName.xml", XML.loadString(printer.format(musicMarshaledXML)) , "UTF-8", true, null)

Mucho agradezco cualquier información sobre el rendimiento o cualquier inconvenientes de esta aplicación (usando XML.guardar()")

1voto

Kersh Puntos 61

Tal vez va a ser útil. Cuando se utiliza el editor de texto, trate de no poner ningún pestañas adicionales en el código XML, ya que será guardado en el archivo xml.

Quiero decir, el código debe ser similar a esto:

val personsXml = 
<persons>
   { persons.map(_.toXml) }
</persons>

En lugar de esto:

val personsXml = 
    <persons>
        { persons.map(_.toXml) }
    </persons>

Es perfectamente trabajado para mí.

0voto

raisercostin Puntos 1489

Adaptado de DOMImplementationLS serializar a Cadena de caracteres en UTF-8 en Java y Cómo bastante de impresión XML desde Java?

  def cleanXml(xml: String): String = {
    import org.w3c.dom.Node
    import org.w3c.dom.bootstrap.DOMImplementationRegistry
    import org.w3c.dom.ls.DOMImplementationLS
    import org.w3c.dom.ls.LSSerializer
    import org.xml.sax.InputSource
    import javax.xml.parsers.DocumentBuilderFactory
    import java.io.StringReader
    val src = new InputSource(new StringReader(xml))
    val document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement
    val keepDeclaration = java.lang.Boolean.valueOf(xml.startsWith("<?xml"))
    val registry = DOMImplementationRegistry.newInstance()
    val impl = registry.getDOMImplementation("LS").asInstanceOf[DOMImplementationLS]
    val lsOutput = impl.createLSOutput
    lsOutput.setEncoding("UTF-8")
    import java.io.StringWriter
    val stringWriter = new StringWriter
    lsOutput.setCharacterStream(stringWriter)
    val writer = impl.createLSSerializer()
    writer.getDomConfig.setParameter("format-pretty-print", true)
    writer.getDomConfig.setParameter("xml-declaration", keepDeclaration)
    writer.write(document, lsOutput)
    stringWriter.toString
  }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X