XML/XPath: Difference between revisions

Content added Content deleted
(→‎Scala: Use for-comprehension in solutions)
Line 2,477: Line 2,477:


=={{header|Scala}}==
=={{header|Scala}}==
The problem description isn't clear on whether what
is wanted is the element or the text. Because of that,
I'm doing both except for the first problem.


The commands are being inputted into Scala's REPL, to
The code is entered in to Scala's REPL, to
better show the results.
better show the results.


<lang scala>
<lang scala>scala> val xml = <inventory title="OmniCorp Store #45x10^3">
scala> val xml: scala.xml.Elem =
| <inventory title="OmniCorp Store #45x10^3">
| <section name="health">
| <section name="health">
| <item upc="123456789" stock="12">
| <item upc="123456789" stock="12">
Line 2,510: Line 2,509:
| </section>
| </section>
| </inventory>
| </inventory>
xml: scala.xml.Elem =
<inventory title="OmniCorp Store #45x10^3">
<section name="health">
<item upc="123456789" stock="12">
<name>Invisibility Cream</name>
<price>14.50</price>
<description>Makes you invisible</description>
</item>
<item upc="445322344" stock="18">
<name>Levitation Salve</name>
<price>23.99</price>
<description>Levitate yourself for up to 3 hours per application</description>
</item>
</section>
<section name="food">
<item upc="485672034" stock="653">
<name>Blork and Freen Instameal</name>
<price>4.95</price>
<description>A tasty meal in a tablet; just add water</description>
</item>
<item upc="132957764" stock="44">
<name>Grob winglets</name>
<price>3.56</price>
<description>Tender winglets of Grob. Just add water</description>
</item>
</section>
</inventory>


scala> val firstItem = xml \\ "item" head
scala> val firstItem = for {
| firstSection <- (xml \ "section").headOption
firstItem: scala.xml.Node =
| firstItem <- (firstSection \ "item").headOption
<item upc="123456789" stock="12">
| } yield firstItem
firstItem: Option[scala.xml.Node] =
Some(<item upc="123456789" stock="12">
<name>Invisibility Cream</name>
<name>Invisibility Cream</name>
<price>14.50</price>
<price>14.50</price>
<description>Makes you invisible</description>
<description>Makes you invisible</description>
</item>
</item>)


scala> xml \\ "price" foreach println
scala> val prices = for {
| section <- (xml \ "section")
<price>14.50</price>
| item <- (section \ "item")
<price>23.99</price>
<price>4.95</price>
| price <- (item \ "price")
| } yield scala.math.BigDecimal(price.text)
<price>3.56</price>
prices: List[scala.math.BigDecimal] = List(14.50, 23.99, 4.95, 3.56)


scala> val salesTax = prices.sum * 0.05
scala> xml \\ "price" map (_ text) foreach println
salesTax: scala.math.BigDecimal = 2.3500
14.50
23.99
4.95
3.56


scala> println(salesTax.setScale(2, BigDecimal.RoundingMode.HALF_UP))
scala> val elements = xml \\ "name" toArray
2.35
elements: Array[scala.xml.Node] = Array(<name>Invisibility Cream</name>, <name>Levitation Salve</name>, <name>Blork and
Freen Instameal</name>, <name>Grob winglets</name>)


scala> val values = xml \\ "name" map (_ text) toArray
scala> val names = for {
| section <- (xml \ "section").toArray
values: Array[String] = Array(Invisibility Cream, Levitation Salve, Blork and Freen Instameal, Grob winglets)</lang>
| item <- (section \ "item")
| name <- (item \ "name")
| } yield name.text
names: Array[String] = Array(Invisibility Cream, Levitation Salve, Blork and Freen Instameal, Grob winglets)</lang>


=={{header|Sidef}}==
=={{header|Sidef}}==