XML 文本中的属性只接受字符串?

发布于 2024-10-08 03:32:59 字数 939 浏览 2 评论 0原文

看来您必须将 XML 文字中的属性值显式指定为字符串:

scala> val foo = 3
foo: Int = 3

scala> <bar id={ foo } />
<console>:10: error: overloaded method constructor UnprefixedAttribute with alternatives:
  (key: String,value: Option[Seq[scala.xml.Node]],next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and>
  (key: String,value: String,next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and>
  (key: String,value: Seq[scala.xml.Node],next1: scala.xml.MetaData)scala.xml.UnprefixedAttribute
 cannot be applied to (java.lang.String, Any, scala.xml.MetaData)
<bar id={ foo } />
 ^

scala> <bar id={ foo.toString } />
res16: scala.xml.Elem = <bar id="3"></bar>

构造函数不能简单地接受 Any 参数并对其调用 toString 吗?由于以下内容有效,

scala> <bar>{ foo }</bar>
res21: scala.xml.Elem = <bar>3</bar>

因此该 API 存在轻微的不对称性。这有什么特别的原因吗?

It seems that you have to explicitly specify attribute values in XML literals as strings:

scala> val foo = 3
foo: Int = 3

scala> <bar id={ foo } />
<console>:10: error: overloaded method constructor UnprefixedAttribute with alternatives:
  (key: String,value: Option[Seq[scala.xml.Node]],next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and>
  (key: String,value: String,next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and>
  (key: String,value: Seq[scala.xml.Node],next1: scala.xml.MetaData)scala.xml.UnprefixedAttribute
 cannot be applied to (java.lang.String, Any, scala.xml.MetaData)
<bar id={ foo } />
 ^

scala> <bar id={ foo.toString } />
res16: scala.xml.Elem = <bar id="3"></bar>

Couldn't the constructor simply accept an Any parameter and call toString on it? Since the following works,

scala> <bar>{ foo }</bar>
res21: scala.xml.Elem = <bar>3</bar>

there's a slight asymmetry in this API. Is there any particular reason for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

み零 2024-10-15 03:32:59

您可以为这种情况添加隐式转换:

scala> val foo = 3
foo: Int = 3

scala> implicit def anyToText( a: AnyVal ) = xml.Text( a.toString )
anyToText: (a: AnyVal)scala.xml.Text

scala> <bar id={foo}/>                                         
res2: scala.xml.Elem = <bar id="3"></bar>

you could add an implicit conversion for this case:

scala> val foo = 3
foo: Int = 3

scala> implicit def anyToText( a: AnyVal ) = xml.Text( a.toString )
anyToText: (a: AnyVal)scala.xml.Text

scala> <bar id={foo}/>                                         
res2: scala.xml.Elem = <bar id="3"></bar>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文