xml - 隐式 append Scala XML 文字

标签 xml scala append literals implicit

Scala 对 XML 文字的支持非常适合生成类型安全的 XHTML 标记;但是,有一个恼人的问题,您必须将文字与 ++ 一起 append 。当给定 block 中包含非 xml 文字代码时的运算符。

例如,这会爆炸:

import scala.xml._

def getNode() = <div>foo</div>
val node: NodeSeq = 
  <div>bar</div>
  <div>baz</div>{
    getNode()
  }

 error: type mismatch;
 found   : scala.xml.Elem
 required: Int
  getNode()

当下面的代码编译时,请注意您必须 ++ 非 xml 文字 getNode() 之后调用,否则只有尾部Elem已生成。

import scala.xml._

def getNode() = <div>foo</div>
val node: NodeSeq = 
  <div>bar</div>
  <div>baz</div> ++ {
    getNode()
  }
  <div>lonely node</div>

node: scala.xml.NodeSeq = NodeSeq(<div>bar</div>, <div>baz</div>, <div>foo</div>)
res6: scala.xml.Elem = <div>lonely node</div>

那么,有没有一种方法可以隐式链接 XML 文字,并在默认情况下返回 Scala 代码?就目前情况而言,在使用 XML 文字时,您会产生一种错误的安全感,因为上面的示例可以编译,但实际上已被破坏。

显式强制 append 文字的一种方法是执行以下操作:

import scala.xml._
def getNode() = <div>foo</div>
def nodify(elems: Elem*): NodeSeq = elems
nodify(
  <div>bar</div>,
  <div>baz</div>,
  getNode(),
  <div>not lonely node</div>
)

res8: scala.xml.NodeSeq = NodeSeq(<div>bar</div>, <div>baz</div>, <div>foo</div>, <div>not lonely node</div>)

但这不太好,因为您必须将 XML 文字 block 包装在方法调用中。至少它强制 append ,没有就无法编译。

希望有一个干净的 XHTML 标记 DSL,如果您有的话请提供 secret 武器! (或者如果我遗漏了一些非常明显的东西,请告诉我)。

谢谢

最佳答案

据我所知,处理此类情况的最佳方法是将表达式包装在无操作 <xml:group/> 中。元素:

import scala.xml._

def getNode() = <div>foo</div>

val node: NodeSeq = <xml:group>
  <div>bar</div>
  <div>baz</div>{
    getNode()
  }
</xml:group>

产量:

scala> node
res0: scala.xml.NodeSeq = 

<div>bar</div>
<div>baz</div><div>foo</div>

关于xml - 隐式 append Scala XML 文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22375209/

相关文章:

java - 在Java中解析和分割大文件大小(800MB UP)的XML内容到多个xml文件的最快方法是什么

jquery - 如果 URL 包含 6 位数字,则将该值 append 到类中

c# - 从 C# 中的 oracle 查询构建 XML 文档

xml - 带有命名空间的 XSLT 导致问题

scala - 修改 Scala 映射值

scala - 使用 Scala : what are the libraries and tools I can use? 进行 GUI 编程

scala - Apache Spark在SQL表达式中启动

javascript - 是否可以使用 jQuery 逐个更改 div 顺序?

MySQL追加无关表

xml - 用于获取元素的第 n 个实例的 XPath 查询