Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala类中漂亮地表示XML实体?_Xml_Scala_Class_Case Class - Fatal编程技术网

如何在Scala类中漂亮地表示XML实体?

如何在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

虽然这个问题可以用其他编程语言来回答,但我觉得Scala中缺少了它

我想在Scala类中使用一个清晰的DSL来表示下面的示例XML,这样我就可以在XML over REST(play)框架中轻松地使用它

<?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>
}