2013-06-13 3 views
9

У меня есть XML-код с встроенной Scala, но он не помещает сгенерированный XML в отдельные строки.Создание отформатированного XML в Scala

В настоящее время, это выглядит так,

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

, но я хочу, чтобы выглядеть следующим образом:

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

Как я могу контролировать форматирование? Вот код, который генерирует XML

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

здесь ToXml:

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

Возможный дубликат [Как создать красиво отформатированный XML в Scala?] (Http://stackoverflow.com/questions/3364627/how-to-produce-nicely-formatted-xml -in-scala) – Suma

ответ

17

Используйте PrettyPrinter:

val xml = // your XML 

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

printer.format(xml) 

Кстати, вы можете рассмотреть вопрос о замене toXML с:

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

Это, вероятно, быстрее и устраняет все возможные проблемы с экранированием. (Что, если value.toString оценивает </a>?)

+0

Спасибо! Много полезной информации – tsjnsn

+0

Есть ли альтернатива 'PrettyPrint', которая возвращается как XML' Node', а не 'String'? Я хотел бы иметь возможность «распечатать» форматированный узел напрямую, не используя вначале симпатичный принтер. Прямо сейчас я строю узел, довольно печатаю, а затем разбираюсь обратно в узел 'XML.loadString (prettyPrinter format xml)' Не кажется очень эффективным. – tsjnsn

+0

@tsjnsn Я понимаю, что вы имеете в виду. По-видимому, 'XML.loadString' сохраняет незначительные пробелы. Это не требуется для поведения синтаксического анализатора XML (см. Http://www.w3.org/TR/xml/#sec-white-space), если не указано в самом документе (и, следовательно, может измениться в будущем). Я рекомендую вам использовать 'PrettyPrinter' только после того, как вам действительно понадобится' String'. – gzm0

Смежные вопросы