24 Stimmen

Wie erzeugt man schön formatiertes XML in Scala?

Nehmen wir an, Sie definieren das Folgende:

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))

Erstellen Sie dann eine XML-Datei und speichern Sie sie in einer Datei:

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

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

Sie erhalten den folgenden lustig aussehenden Text:

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

Dies ist natürlich vollkommen gültiges XML, aber wenn Sie wollen, dass es in einem anständigen Texteditor von Menschen bearbeitet werden kann, wäre es vorzugsweise um sie ein wenig besser zu formatieren.

Durch das Ändern der Einrückung an verschiedenen Stellen der Scala-XML-Literale - so dass der Code aussieht weniger schön - es ist möglich, Variationen der obigen Ausgabe zu erzeugen, aber es scheint unmöglich zu sein, es ganz richtig hinzubekommen. Ich verstehe warum es wird auf diese Weise formatiert, aber ich frage mich, ob es irgendwelche Möglichkeiten gibt, das zu umgehen.

0voto

raisercostin Punkte 8349

Angepasst von DOMImplementationLS serialize to String in UTF-8 in Java y Wie kann man XML aus Java heraus schön drucken?

  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
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X