2016-11-26 51 views
2

我正在向我的Play應用程序發佈XML,並且我希望我的控制器操作可以查找特定字段,更新字段值並將其發回。Scala更新XML請求

示例XML:

<name>shrek</name> 
<type>ogre</type> 
<category>dank</category> 

我的控制器動作,只是返回我張貼相同的XML:

def updateShrekXML() = Action(parse.xml) { request => 
    Ok(request.body) 
} 

我看了播放文檔,但它是非常有限的,如何我是否可以使用更新的字段返回XML,例如將shrek更改爲kek

回答

2

是的,我們沒有找到太多有關XML解析和更新Docs

,但我們可以通過考慮實現這個XML NodeScala Class

這裏是一個在你的病情

適用於您的XML對象創建一個階模型的工作示例

class SomeXML(var name: String, var itemType: String, var category: String){ 

    def toXML = { //converts to XML 
    <xml> 
     <name>{name}</name> 
     <type>{itemType}</type> 
     <category>{category}</category> 
    </xml> 
    } 

    //we can also use setters/getters without writing XML node everytime. Just calling .toXML gives the node 
    def updateName(newName: String) ={ //updates name 
    <xml> 
     <name>{newName}</name> 
     <type>{itemType}</type> 
     <category>{category}</category> 
    </xml> 
    } 

    //some other utilities of your choice 

} 

用於反序列化XML的同類對象

object SomeXML { 

    def fromXML(xmlNode: scala.xml.Node) = { //converts XML to Scala Object 
    val name = (xmlNode \ "name").text 
    val itemType = (xmlNode \ "type").text 
    val category = (xmlNode \ "category").text 
    new SomeXML(name, itemType, category) 
    } 

} 

控制器:

def updateXML() = Action(parse.xml) { request => 
    val originalXML = SomeXML.fromXML(request.body.head) //(.head) reads XML node from Node sequence 
    val updatedXML = originalXML.updateName("YourName") 
    Ok(updatedXML) 
    //Output: YourName ogre dank 
    } 

同樣,我們可以創建scala class爲每XML request,寫自己的效用函數來處理。

如果我在play framework中找到任何庫或實用程序來執行此操作,我將在此更新。