2009-04-16 30 views
7

Nhìn thấy sức mạnh của Scala, tôi tự hỏi nếu một đồ thị đối tượng tùy ý có thể được tuần tự hóa và deserialized/từ XML sử dụng các tính năng và thư viện ngôn ngữ Scala tích hợp (ví dụ: không có XMLEncoder, XStream hoặc JAXB). Thật không may, tôi đã không tìm thấy một giải pháp như vậy. Bạn có thể tư vấn cho điều gì?Xem thêm Scala XML serialization

Trả lời

4

afaik không có thứ gì như vậy. Nhưng bạn có thể muốn xem sbinary

0

Không có gì trong thư viện lớp gốc của Scala. Nhưng không thiếu các thư viện Java sẽ làm điều này.

1

Về "lời khuyên", chúng tôi đã sử dụng thư viện gốc cho nhiều tệp cấu hình nhanh chóng và dơ bẩn. Ưu điểm chính là mã "phân tích cú pháp" được sử dụng để thêm các thông báo lỗi đẹp. Như thế này:

val xml = xml.XML.load(source) 

val required = (xml \ "value").firstOption match { 
    case None => error("The value element is missing, or should I be a default?") 
    case Some(req) => req 
} 

Đây là nơi tôi thường sử dụng một cái gì đó như XStream, vì vậy nó không phải là một công tắc lớn. Tôi không chắc chắn nếu bạn có thể nhận được thông báo lỗi + xử lý mặc định trên khuôn khổ deserialization của bạn với một thư viện.

8

Tôi không biết "nếu đồ thị đối tượng tùy ý có thể được tuần tự hóa và deserialized thành/từ XML sử dụng các tính năng và thư viện ngôn ngữ Scala tích hợp", nhưng vì có một số hỗ trợ nguyên gốc cho XML trong Scala, tôi sẽ Đề cập đến chúng. Chi tiết hơn có thể được tìm thấy trong Ch. 26 của Programming in Scala được gọi là Làm việc với XML:

Chương này giới thiệu hỗ trợ của Scala cho XML. Sau khi thảo luận dữ liệu bán cấu trúc nói chung, nó hiển thị chức năng cần thiết trong Scala để thao tác XML: cách tạo các nút với XML literals, cách lưu và tải XML vào tệp và cách tách rời các nút XML sử dụng truy vấn phương pháp và đối sánh mẫu.

Để tóm tắt nhanh chương, tôi sẽ trích dẫn một số điểm chính.

  • Scala bao gồm hỗ trợ đặc biệt để xử lý XML.
  • Scala cho phép bạn nhập XML dưới dạng chữ ở bất kỳ đâu mà biểu thức hợp lệ.
  • Bạn có thể đánh giá mã Scala ở giữa một chữ XML bằng cách sử dụng dấu ngoặc nhọn ({}) làm lối thoát.

Vì vậy, bạn có thể viết một cái gì đó như:

val foo = <a> {3 + 4} </a> 

Các đánh giá lại ở trên để scala.xml.Elem = <a> 7 </a>.

  • Nếu bạn muốn tìm một phần tử con theo tên thẻ, chỉ cần gọi \ với tên của thẻ.
  • Bạn có thể thực hiện "tìm kiếm sâu" và xem qua các phần tử phụ, v.v. bằng cách sử dụng \\ thay vì toán tử \.

Cuốn sách có một ví dụ về serialization và deserialization của một lớp trừu tượng, nhưng nó viết tay:

abstract class CCTherm { 
    val description: String 
    val yearMade: Int 

    def toXML = 
    <cctherm> 
     <description>{description}</description> 
     <yearMade>{yearMade}</yearMade> 
    </cctherm> 

    def fromXML(node: scala.xml.Node): CCTherm = 
    new CCTherm { 
     val description = (node \ "description").text 
     val yearMade = (node \ "yearMade").text.toInt 
    }  
} 

Cũng biết thêm có thể được tìm thấy trong một dự thảo cuốn sách được gọi là scala.xml.

+0

Cảm ơn câu trả lời chi tiết. Tôi muốn một giải pháp chung mặc dù, nơi mã serialization được viết chỉ một lần và không phải trong mỗi lớp để tránh mã boilerplate và sao chép thông tin. – thSoft

3

Trong net.liftweb.json gói, đối tượng xml, tôi tìm thấy những chức năng sau đây:

def toXml(json: JValue): NodeSeq = { 
    def toXml(name: String, json: JValue): NodeSeq = json match { 
     case JObject(fields) => new XmlNode(name, fields flatMap { f => toXml(f.name, f.value) }) 
     case JArray(xs) => xs flatMap { v => toXml(name, v) } 
     case JField(n, v) => new XmlNode(name, toXml(n, v)) 
     case JInt(x) => new XmlElem(name, x.toString) 
     case JDouble(x) => new XmlElem(name, x.toString) 
     case JString(x) => new XmlElem(name, x) 
     case JBool(x) => new XmlElem(name, x.toString) 
     case JNull => new XmlElem(name, "null") 
     case JNothing => Text("") 
    } 

    json match { 
     case JField(n, v) => toXml(n, v) 
     case JObject(fields) => fields flatMap { f => toXml(f.name, f.value) } 
     case x => toXml("root", x) 
    } 
    } 

Có một gói Khai thác có chức năng để chuyển đổi ít nhất lớp trường hợp để JSON. Cùng với toXml, điều này có thể chuyển đổi nhiều kiểu dữ liệu thành XML.

Các vấn đề liên quan