要測試可以轉換XML文檔中的Text元素的方法,我編寫了兩個非常簡單的選擇器,並在生成的Zipper上應用map/toUpperCase。結果應該是除了通過第一個選擇器排除的那些文本元素之外的所有文本元素都被轉換爲大寫。但它只適用於最深的文本元素。下面的代碼:反XML:使用自定義選擇器的Zipper上的某些修改不會在取消選擇後保留
scala> import com.codecommit.antixml._
import com.codecommit.antixml._
scala> val elemSelector = Selector({case x:Elem if x.name != "note" => x})
elemSelector: com.codecommit.antixml.Selector[com.codecommit.antixml.Elem] = <function1>
scala> val textSelector = Selector({case x:Text => x})
textSelector: com.codecommit.antixml.Selector[com.codecommit.antixml.Text] = <function1>
scala> val xml = XML.fromString("<tei><div><p>this<note>not<foreign lang=\"greek\">that</foreign>not</note></p><p>those<hi>these</hi></p></div></tei>")
xml: com.codecommit.antixml.Elem = <tei><div><p>this<note>not<foreign lang="greek">that</foreign>not</note></p><p>those<hi>these</hi></p></div></tei>
scala> val zipper = xml \\ elemSelector \ textSelector
zipper: com.codecommit.antixml.Zipper[com.codecommit.antixml.Text] = thisthatthosethese
scala> val modified = zipper.map(t => new Text(t.text.toUpperCase))
modified: com.codecommit.antixml.Zipper[com.codecommit.antixml.Text] = THISTHATTHOSETHESE
scala> val result = modified.unselect.unselect
result: com.codecommit.antixml.Zipper[com.codecommit.antixml.Node] = <tei><div><p>this<note>not<foreign lang="greek">THAT</foreign>not</note></p><p>those<hi>THESE</hi></p></div></tei>
因此,在倒數第二個命令,上殼適用於所有有針對性的文字內容,但走出的拉鍊後,只有兩個的四個要素的轉化。我試過<hi/>
而不是<hi>these</hi>
,然後those
得到大寫。任何想法這裏有什麼問題?
我使用的是Scala 2.10.3的arktekk.no fork。
感謝您的指點。我看了一下合併策略,然後按照你的建議不要浪費太多時間。我最終編寫了一個SAX解析器。 – fbaumgardt