2012-12-02 29 views
2

我正在使用scala.xml.pull解析通過一個不同的大XML文件。這對於事件處理非常有用,但我想要做的是讓我的解析器爲特定節點咳嗽一個小文檔,並且我看不到一個簡單的方法來執行此操作,或者至少不是「scala」方式。使用scala.xml.pull提取節點及其所有子節點的最佳方法是什麼?

我想我建立一個搜索功能這樣,可以使用迭代器發現我的標籤相匹配的EvElemStart事件:

def seek(tag: String) = { 
    while (it.hasNext) { 
    it.next match { 
     case EvElemStart(_, `tag`, _, _) => 

在那之後,我不太清楚。是否有一種簡單的方法將此標記的所有子元素都抓到文檔中,而不必遍歷XMLEventReader彈出的每個事件?

我最終尋找的是一個掃描文件併爲每個特定標記或一組標記的每個實例發出一個xml元素(Elem?)的過程,我可以使用正常的scala xml處理來處理這些元素。

+0

你能否在你的問題中添加一些更多的信息作爲你想從短片段中獲得的行爲的例子? –

回答

1

這是我最終做的。 slurp(標籤)尋找標籤的下一個實例並返回該標籤的完整節點樹。

def slurp(tag: String): Option[Node] = { 
    while (it.hasNext) { 
    it.next match { 
     case EvElemStart(pre, `tag`, attrs, _) => return Some(subTree(tag, attrs)) 
     case _ => 
    } 
    } 
    return None 
} 

def subTree(tag: String, attrs: MetaData): Node = { 
    var children = List[Node]() 

    while (it.hasNext) { 
    it.next match { 
     case EvElemStart(_, t, a, _) => { 
     children = children :+ subTree(t, a) 
     } 
     case EvText(t) => { 
     children = children :+ Text(t) 
     } 
     case EvElemEnd(_, t) => { 
     return new Elem(null, tag, attrs, xml.TopScope, children: _*) 
     } 
     case _ => 
    } 
    } 
    return null // this shouldn't happen with good XML 
} 
相關問題