2011-01-07 33 views

Trả lời

11

Bạn không thể làm bất kỳ điều gì với các phương pháp \ hoặc \\ hiện có trên NodeSeq. Nhưng bạn thể mở rộng NodeSeq với một \* phương pháp mới (lưu ý việc thiếu hoặc không gian nhân vật), theo mô hình ma cô-bạn-thư viện:

import xml.{NodeSeq, Elem} 

class ChildSelectable(ns: NodeSeq) { 
    def \* = ns flatMap { _ match {          
    case e:Elem => e.child         
    case _ => NodeSeq.Empty         
    } } 
} 

implicit def nodeSeqIsChildSelectable(xml: NodeSeq) = new ChildSelectable(xml) 

Trong REPL, điều này sau đó mang lại cho tôi:

scala> val xml = <a><b><c>xxx</c></b></a> 
xml: scala.xml.Elem = <a><b><c>xxx</c></b></a> 

scala> xml \*                    
res7: scala.xml.NodeSeq = NodeSeq(<b><c>xxx</c></b>) 

scala> xml \ "b" \* 
res8: scala.xml.NodeSeq = NodeSeq(<c>xxx</c>) 

scala> xml \ "b" \ "c" \* 
res9: scala.xml.NodeSeq = NodeSeq(xxx) 
6

này là khá gần với những gì bạn đang tìm kiếm:

import scala.xml.Elem 

val xml = <a><b><c>HI</c></b></a> 

println(xml) 
println(xml \ "_") 
println(xml \ "b") 
println(xml \ "b" \ "_") 
println(xml \ "b" \ "c") 
println(xml \ "b" \ "c" \ "_") 


<a><b><c>HI</c></b></a> 
<b><c>HI</c></b> 
<b><c>HI</c></b> 
<c>HI</c> 
<c>HI</c> 
// Empty 
+0

Th là tốt hơn so với câu trả lời được chấp nhận. '" _ "' thực hiện chính xác những gì được yêu cầu, mà không cần phải viết một phương thức mới. Ít mã để duy trì, ít cú pháp không chuẩn để gây nhầm lẫn cho người tiếp theo nhìn vào mã của bạn. – rumtscho

+0

không đánh giá quá cao điều này awnser. scala-xml bị hỏng. Sử dụng một cái gì đó như https://github.com/lihaoyi/scalatags hoặc https://github.com/chris-twiner/scalesXml –

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