스칼라의 동적 레이블과 속성으로 XML을 구성 하시겠습니까?
문제
나는 이것을 할 수 있기를 원한다 :
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
, 또한 존재합니다.
제휴하지 않습니다 StackOverflow