加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中使用动态标签和属性构建XML?

发布时间:2020-12-16 09:42:28 所属栏目:安全 来源:网络整理
导读:我想要这样做: val myXml = myTag { someAttributes } /myTag (因为我不知道编译时的属性详细信息) 和这个: val myXml = {someTag}/{someTag} 这是不正确的Scala语法。最接近的是使用Elem对象来构造元素,但是它有点麻烦(插入PCDATA,我不想要它)。有没有
我想要这样做:

val myXml = <myTag { someAttributes }> </myTag>

(因为我不知道编译时的属性详细信息)

和这个:

val myXml = <{someTag}></{someTag}>

这是不正确的Scala语法。最接近的是使用Elem对象来构造元素,但是它有点麻烦(插入PCDATA,我不想要它)。有没有办法像上面那样做?

解决方法

val myXml = <myTag/> % Attribute(None,"name",Text("value"),Null)

请参阅不同构造函数的scala.xml.Attribute。

向所有子项添加相同的属性:

scala> val xml = <root><a/><b/><c/></root>
xml: scala.xml.Elem = <root><a></a><b></b><c></c></root>

scala> xml.child map (_ match {
     | case elem : Elem => elem % Attribute(None,Null)
     | case x => x
     | })
res3: Sequence[scala.xml.Node] = ArrayBuffer(<a name="value"></a>,<b name="value"></b>,<c name="value"></c>)

您还可以使用scala.xml.transform中的内容递归地执行所有XML:

val rr = new RewriteRule {
  override def transform(n: Node): Seq[Node] = n match {
    case elem : Elem => elem % Attribute(None,Null) toSeq
    case other => other
  }
}

val rt = new RuleTransformer(rr)

scala> rt(xml)
res5: scala.xml.Node = <root name="value"><a name="value"></a><b name="value"></b><c name="value"></c></root>

或者您可以将属性添加到xml的任意部分:

scala> val xml = <root>{<a/> % Attribute(None,Null)}</root>
xml: scala.xml.Elem = <root><a name="value"></a></root>

编辑

改变名字很容易做到Scala 2.8,像这样:

val someTag = "tag"
val myXml = <root>{<a/>.copy(label = someTag)}</root>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读