2011-08-05 33 views
11

Tôi muốn xem viết lại tập lệnh dưới đây bằng cách sử dụng http://anti-xml.org thay vì Scala XML.Ví dụ về xử lý xml nhưng sử dụng anti-xml thay vì Scala xml

Đây là một đoạn trích từ Chương 10 Herding XML trong Scala - http://ofps.oreilly.com/titles/9780596155957/HerdingXMLInScalaDSLs.html

// code-examples/XML/reading/pattern-matching-script.scala 
import scala.xml._ 
val someXML = 
<sammich> 
    <bread>wheat</bread> 
    <meat>salami</meat> 
    <condiments> 
    <condiment expired="true">mayo</condiment> 
    <condiment expired="false">mustard</condiment> 
    </condiments> 
</sammich> 

someXML match { 
case <sammich>{ingredients @ _*}</sammich> => { 
    for (cond @ <condiments>{_*}</condiments> <- ingredients) 
     println("condiments: " + cond.text) 
    } 
} 

Cảm ơn

Trả lời

6

Tôi không quen thuộc với antixml, tuy nhiên, như không có câu trả lời khác, tôi sẽ làm cho một thử

Chỉ cần cho các hồ sơ, mã của bạn trả về

mayo 
    mustard 

Chính xác hơn, chuỗi bắt đầu bằng khoảng trống/dòng mới giữa phần cuối và đầu của chuỗi đầu tiên. Khoảng trống giữa mayo và mù tạc là khoảng trống giữa hai gia vị, và khoảng trống sau mù tạt là cái trước khi đóng cửa.

Trong antixml, điều đầu tiên cần làm dường như chuyển đổi của bạn, mà chỉ đơn giản

val someAntiXml = someXML.anti 

Lấy phần gia vị là rất dễ dàng:

var condiments = someAntiXml \ 'condiments 

Sau đó, người ta phải trích xuất các văn bản. Nó nghe có vẻ giống như cách để làm điều này là

condiments \\ text 

Nhưng \\ không đi qua cấu trúc theo thứ tự, nó trông giống như traversal chiều rộng đầu tiên. Kết quả là, khoảng trống, mà chỉ là dưới gia vị, đến trước mayo và mù tạt, đó là một mức độ dưới đây, trong các yếu tố.

Vì vậy, đây là triển khai có thể thực hiện để truy xuất văn bản. Có lẽ có một cách tiêu chuẩn hơn, nhưng tôi không tìm thấy.

def textOf(g: Group[Node]) : String = 
    g.toList.map{ 
    case Elem(_, _, _, _, children) => textOf(children) 
    case t: Text => t.text 
    case c: CDATA => c.text 
    case _ => "" 
    }.mkString 

Sau đó, textOf(someAntiXml \ "condiments") cho kết quả mong đợi.

+0

Một chút muộn nhưng ... cảm ơn! – Rodolfo

+2

Trong anti-xml 0.3 và sau đó, [\\ không di chuyển theo thứ tự độ sâu đầu tiên] (https://github.com/djspiewak/anti-xml/issues/49), vì vậy 'condiments \\ text' hiện hoạt động tốt . – Steve

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