سكالا: كيفية إنشاء العقد XML من جمع بعض

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

  •  03-07-2019
  •  | 
  •  

سؤال

إذا كان لديك شيء من هذا القبيل:

val myStuff = Array(Person("joe",40), Person("mary", 35))

وكيف يمكن خلق قيمة XML مع هذه البيانات في العقد؟ أنا أعرف كيفية استخدام {} الأقواس في تعبير XML لوضع قيمة، ولكن هذا هو عبارة عن مجموعة من القيم. هل أنا بحاجة إلى تكرار صراحة أو هناك شيء أفضل؟

val myXml = <people>{ /* what here?! */ }</people>

ويجب أن تكون القيمة الناتجة شيئا مثل:

<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
هل كانت مفيدة؟

المحلول

وكما انها وظيفية Array.map لغة البرمجة وربما ما كنت تبحث عن:

class Person(name : String, age : Int){
    def toXml() = <person><name>{ name }</name><age>{ age }</age></person>
}

object xml {
    val people = List(
        new Person("Alice", 16),
        new Person("Bob", 64)
    )

    val data = <people>{ people.map(p => p.toXml()) }</people>

    def main(args : Array[String]){
        println(data)
    }
}

والنتائج في:

<people><person><name>Alice</name><age>16</age></person><person><name>Bob</name><age>64</age></person></people>

وهناك نتيجة تنسيق (لقراءة أفضل):

<people>
   <person>
      <name>Alice</name>
      <age>16</age>
   </person>
   <person>
      <name>Bob</name>
      <age>64</age>
   </person>
</people>

نصائح أخرى

لاكتمال، يمكنك أيضا استخدام for..yield (أو المكالمات وظيفة):

import scala.xml

case class Person(val name: String, val age: Int) {
  def toXml(): xml.Elem =
    <person><name>{ name }</name><age>{ age }</age></person>
}

def peopleToXml(people: List[Person]): xml.Elem = {
  <people>{
    for {person <- people if person.age > 39}
      yield person.toXml
  }</people>
}

val data = List(Person("joe",40),Person("mary", 35))
println(peopleToXml(data))

و(خطأ ثابت لاحظ ودي فولسوم)

والواقع، وperson.toXml العائد خط () لا تجميع بالنسبة لي، ولكن person.toXml العائد (بدون أقواس) لا. النسخة الأصلية يشكو من "تنطبق قيمة طريقة زائد" حتى إذا قمت بتغيير مواطنه من "ToXml في العودة صراحة scala.xml.Elem

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top