我希望能夠做到這一點:在Scala中構建具有動態標籤和屬性的XML?
val myXml = <myTag { someAttributes }> </myTag>
(因爲我不知道是什麼屬性的細節是在編譯時)
這:
val myXml = <{someTag}></{someTag}>
這ISN沒有有效的Scala語法。我可以最接近的是使用Elem對象來構造元素,但是它有點麻煩(插入PCDATA,我不希望它)。有沒有像上面這樣做的方法?
我希望能夠做到這一點:在Scala中構建具有動態標籤和屬性的XML?
val myXml = <myTag { someAttributes }> </myTag>
(因爲我不知道是什麼屬性的細節是在編譯時)
這:
val myXml = <{someTag}></{someTag}>
這ISN沒有有效的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, "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
,這也存在。
謝謝!在閱讀Daniel的回覆之後,我認爲「Null」是一個錯字,而是寫了「null」。 – KajMagnus 2011-02-07 05:41:08
非常感謝! – Joe 2009-10-21 15:39:10
雖然這不讓我創建具有給定標籤的節點。我看不到創建任意XML結構的方法。 Elem提取器爲兒童提供可變參數。我希望能夠通過一個NodeSeq(任何大小)。 – Joe 2009-10-21 16:41:48
任何方式創建一個節點,如在OP中的第二個片段? – IttayD 2010-05-26 12:58:43