بناء XML مع تسمية الحيوية والصفات في سكالا?
سؤال
كنت تريد أن تكون قادرة على القيام بذلك:
val myXml = <myTag { someAttributes }> </myTag>
(لأنني لا أعرف ما السمة التفاصيل في وقت الترجمة)
و هذا:
val myXml = <{someTag}></{someTag}>
هذه ليست صالحة سكالا الجملة.أقرب ما يكون هو استخدام ابتدائي كائن لبناء العناصر ولكنها مزعجة قليلا (إدخال 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>)
يمكنك أيضا استخدام الاشياء في سكالا.xml.تحويل القيام بذلك بشكل متكرر كل 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>
تحرير
تغيير الاسم من السهل القيام به على سكالا 2.8, مثل هذا:
val someTag = "tag"
val myXml = <root>{<a/>.copy(label = someTag)}</root>
نصائح أخرى
ملحوظة: تحتاج إلى
import scala.xml.Null
للحصول على هذا العمل، وليس scala.Null
، والتي وجدت أيضا.
لا تنتمي إلى StackOverflow