2016-11-26 1 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を返すことはできますか?たとえば、shrekkekに変更しますか?

答えて

2

はい、Docsで、XMLの解析と更新についてよく分かりませんでした。

しかし、我々は考慮してこれを達成することができますXML Nodeここ

あなたのXMLオブジェクトのScalaのモデルを作成し、あなたの条件

で働く作業例があるScala Classとして

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 
    } 

同じで、我々はすべてのXML requestためscala classを作成および操作するために、独自のユーティリティ関数を書くことができます。

play frameworkでこれを行うライブラリまたはユーティリティが見つかった場合は、ここで更新します。

関連する問題