2013-06-13 13 views
9

Tôi có một số XML được tạo bằng Scala được nhúng, nhưng nó không đặt XML được tạo trên các dòng riêng biệt.Tạo XML được định dạng trong Scala

Hiện nay, có vẻ như thế này,

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

nhưng tôi muốn nó trông như thế này:

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

Làm thế nào tôi có thể kiểm soát các định dạng? Đây là mã mà tạo ra XML

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

đây là ToXml:

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

Bản sao có thể có của [Cách tạo XML được định dạng tốt trong Scala?] (Http://stackoverflow.com/questions/3364627/how-to-produce-nicely-formatted-xml -in-scala) – Suma

Trả lời

17

Sử dụng một PrettyPrinter:

val xml = // your XML 

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

printer.format(xml) 

Bằng cách này, bạn có thể muốn xem xét thay thế toXML của bạn với:

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

Điều này có lẽ nhanh hơn và loại bỏ tất cả các loại vấn đề thoát. (Điều gì xảy ra nếu value.toString đánh giá là </a>?)

+0

Cảm ơn! Rất nhiều thông tin tốt – tsjnsn

+0

Có cách nào khác thay thế cho 'PrettyPrint' trả về dưới dạng một' Node' của XML thay vì một 'Chuỗi'? Tôi muốn có thể 'in' nút được định dạng trực tiếp mà không sử dụng trình khởi đầu tiên. Ngay bây giờ tôi đang xây dựng nút, in đẹp, và sau đó phân tích cú pháp trở lại thành một nút 'XML.loadString (định dạng prettyPrinter xml)' Có vẻ như không hiệu quả lắm. – tsjnsn

+0

@tsjnsn Tôi hiểu ý của bạn là gì. Rõ ràng 'XML.loadString' giữ lại khoảng trắng không đáng kể. Đây không phải là hành vi bắt buộc đối với một trình phân tích cú pháp XML (xem http://www.w3.org/TR/xml/#sec-white-space) trừ khi được quy định trong chính tài liệu (và do đó có thể thay đổi trong tương lai). Tôi khuyên bạn nên sử dụng 'PrettyPrinter' chỉ khi bạn thực sự cần một' Chuỗi'. – gzm0