스칼라의 동적 레이블과 속성으로 XML을 구성 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/1600997

  •  05-07-2019
  •  | 
  •  

문제

나는 이것을 할 수 있기를 원한다 :

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

(컴파일 시간에 속성 세부 사항이 무엇인지 모르기 때문에)

이:

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

이것은 유효한 스칼라 구문이 아닙니다. 내가 올 수있는 가장 가까운 것은 Elem Object를 사용하여 요소를 구성하는 것이지만, 조금 번거로움입니다 (원하지 않는 곳에 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, "name", Text("value"), 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, "name", Text("value"), 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, "name", Text("value"), 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>

다른 팁

참고 : 필요합니다

import scala.xml.Null

이것을 작동시키기 위해 scala.Null, 또한 존재합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top