Scala XML API:为什么允许 NodeSeq 作为属性值?

发布于 2024-10-11 06:01:17 字数 783 浏览 0 评论 0原文

看来属性值的类型是Seq[Node]

scala> <a b="1"/>.attribute("b")             
res11: Option[Seq[scala.xml.Node]] = Some(1)

这意味着您可以将 XML 指定为属性值。

scala> <a b={<z><x/></z>}/>.attribute("b")            
res16: Option[Seq[scala.xml.Node]] = Some(<z><x></x></z>)

scala> <a b={<z><x/></z>}/>.attribute("b").map(_ \ "x")
res17: Option[scala.xml.NodeSeq] = Some(<x></x>)

scala> new xml.PrettyPrinter(120, 2).format(<a b={<z><x/></z>}/>)
res19: String = <a b="<z><x></x></z>"></a>

这对我来说似乎很时髦。我从未将 XML 视为现实世界中的属性值。为什么允许?为什么属性值根本不是 String 类型?

It seems attribute values are of type Seq[Node].

scala> <a b="1"/>.attribute("b")             
res11: Option[Seq[scala.xml.Node]] = Some(1)

This means you can assign XML as an attribute value.

scala> <a b={<z><x/></z>}/>.attribute("b")            
res16: Option[Seq[scala.xml.Node]] = Some(<z><x></x></z>)

scala> <a b={<z><x/></z>}/>.attribute("b").map(_ \ "x")
res17: Option[scala.xml.NodeSeq] = Some(<x></x>)

scala> new xml.PrettyPrinter(120, 2).format(<a b={<z><x/></z>}/>)
res19: String = <a b="<z><x></x></z>"></a>

This seems funky to me. I've never seen XML as attribute values in the real world. Why is it allowed? Why is an attribute value simply not of type String?

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

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

发布评论

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

评论(1

篱下浅笙歌 2024-10-18 06:01:17

摘自 Burak Emir 的 scala.xml“草稿”一书

开始引用

乍一看,属性似乎只能是字符串,而不能是其他内容。但是,有两个原因允许在 XML 中出现相同类型的节点(元素节点除外):数据值和实体引用。

<foo name= "süss" life={Atom(42)}>

end quote

现在我已经在 2.8.0 中尝试过,但它不能完全编译 - 我需要使用 new Atom(42)。但我可以输入这样的内容:

<foo name={List(Text("s"), EntityRef("uuml"), Text("ss"))}/> 

所以这是利用节点属性的部分原理。是的,这有点时髦。

From the scala.xml "draft" book by Burak Emir:

begin quote

At first sight, it appears that attributes should only be strings and nothing else. However, there are two reasons to allow the same kind of nodes (other than element nodes) that can appear within XML: data values and entity references.

<foo name= "süss" life={Atom(42)}>

end quote

Now I've tried that in 2.8.0 and it doesn't quite compile - I need to use new Atom(42). But I can type something like this:

<foo name={List(Text("s"), EntityRef("uuml"), Text("ss"))}/> 

So that was part of the rationale for leveraging nodes for attributes. And yeah it's a bit funky.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文