如何在Scala类中漂亮地表示XML实体?
虽然这个问题可以用其他编程语言来回答,但我觉得Scala中缺少了它 我想在Scala类中使用一个清晰的DSL来表示下面的示例XML,这样我就可以在XML over REST(play)框架中轻松地使用它如何在Scala类中漂亮地表示XML实体?,xml,scala,class,case-class,Xml,Scala,Class,Case Class,虽然这个问题可以用其他编程语言来回答,但我觉得Scala中缺少了它 我想在Scala类中使用一个清晰的DSL来表示下面的示例XML,这样我就可以在XML over REST(play)框架中轻松地使用它 <?xml version="1.0" encoding="UTF-8"> <requests> <request type="foo" id="1234"> <recipient>bar<recipient> &l
<?xml version="1.0" encoding="UTF-8">
<requests>
<request type="foo" id="1234">
<recipient>bar<recipient>
<recipient>baz<recipient>
<body>This is an example string body</body>
<ext>Optional tag here like attachments</ext>
<ext>Optional too</ext>
</request>
</requests>
这不是家庭作业,我正在尝试编写一个应用程序,将一家公司的内部REST转换为行业标准。(如果有人好奇,那就是OpenCable ESNI vI02 XML格式)
我的问题:我是否正确地表示了“foo”和“id”属性?如果是这样的话,我将如何轻松地输出XML,而无需进行大量的处理或原始的字符串插值。我希望foo和id被解释为属性,而不是像这样的嵌套标记:
...<request><type>foo</type><id>1234</id>...DO NOT WANT
…foo1234…不想要
谢谢 XML标记是Scala中的头等公民,使您能够以比其他语言更干净的方式使用标记 从Scala2.11开始,XML库已被提取到 这样,您就可以轻松地使用一些惯用的Scala来实现您的目标:
case class Request(requestType: String, id: Int, recipients: List[String], body: String, ext: Option[List[String]]){
def toXML =
<requests>
<request type={requestType} id={id}>
{recipientsXML}
<body>{body}</body>
{extXML}
</request>
</requests>
private def recipientsXML =
recipients.map(rec => <recipient>{rec}</recipient>)
private def extXML = for {
exts <- ext
elem <- exts
} yield <ext>{elem}</ext>
}
case类请求(requestType:String,id:Int,recipients:List[String],body:String,ext:Option[List[String]){
def-toXML=
{recipientsXML}
{body}
{extXML}
专用def recipientsXML=
recipients.map(rec=>{rec})
私有def extXML=for{
exts您是否忘记了toXML def中XML标记周围的双引号?
case class Request(requestType: String, id: Int, recipients: List[String], body: String, ext: Option[List[String]]){
def toXML =
<requests>
<request type={requestType} id={id}>
{recipientsXML}
<body>{body}</body>
{extXML}
</request>
</requests>
private def recipientsXML =
recipients.map(rec => <recipient>{rec}</recipient>)
private def extXML = for {
exts <- ext
elem <- exts
} yield <ext>{elem}</ext>
}