Default instances


Basic types

The following types have NodeDecoder instances available out of the box:


There also is a default NodeDecoder instance available for Date, but this one is slightly more complicated. There are so many different ways of writing dates that there is no reasonable default behaviour - one might argue that defaulting to ISO 8601 might make sense, but there doesn’t appear to be a sane way of implementing that in Java’s crusty date / time API.

Instead of providing a default implementation that is likely going to be incorrect for most people, kantan.xpath provides easy tools for creating decoders from an instance of DateFormat.

We could for example declare a decoder for something ISO 8601-like:

import kantan.xpath.implicits._
import kantan.xpath.NodeDecoder
import java.util.{Locale, Date}

implicit val decoder: NodeDecoder[Date] = NodeDecoder.dateDecoder(new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH))

And we’re now capable of decoding XML content as dates:

// res0: kantan.xpath.package.XPathResult[Date] = Right(
//   value = Fri Dec 31 00:00:00 CET 1999
// )


For any two types A and B that each have a NodeDecoder, there exists a NodeDecoder[Either[A, B]].

This is useful for dodgy XML data where the type of a value is not well defined - it might sometimes be an int, sometimes a boolean, for example:

"<root><either>123</either><either>true</either></root>".evalXPath[List[Either[Int, Boolean]]](xp"//either")
// res1: kantan.xpath.package.XPathResult[List[Either[Int, Boolean]]] = Right(
//   value = List(Left(value = 123), Right(value = true))
// )


For any type A that has a NodeDecoder, there exists a NodeDecoder[Option[A]].

This is useful for XML where some nodes or attributes are optional. For example:

// res2: kantan.xpath.package.XPathResult[Option[Int]] = Right(value = None)


The following types have an instance of XmlSource out of the box:

Other tutorials: