Я пытаюсь использовать библиотеку xtract , и я испытываю трудности при разборе xml.
build.sbt:
scalaVersion := "2.12.8"
libraryDependencies ++= Seq(
"com.lucidchart" %% "xtract" % "2.0.0",
)
У меня получен этот xml изспортивный API:
<Export>
<GeneralInformation>
<Date>2019-05-17</Date>
<Time>14:21:30</Time>
<Timestamp>1558102890303</Timestamp>
</GeneralInformation>
<Sport code="SOC" id="1" name="SOCCER" hid="13383104" lineup_hid="785967" commentary_hid="1335638">
<Matchday date="2019-04-14">
<Match ct="-2" id="1597322" lastPeriod="2 HF" leagueCode="44337" leagueSort="11" leagueType="LEAGUE" startTime="10:00" status="Fin" statustype="fin" type="2" visible="1" lineups="1">
...
</Match>
<Match ct="-6" id="1599008" lastPeriod="2 HF" leagueCode="44415" leagueSort="11" leagueType="LEAGUE" startTime="10:30" status="Fin" statustype="fin" type="2" visible="1" lineups="1">
...
</Match>
</Matchday>
</Sport>
<Sport code="BSK" id="3" name="BASKETBALL" hid="10716464" lineup_hid="101838" commentary_hid="0">
<Matchday date="2019-04-14">
<Match ct="0" id="5181854" lastPeriod="4Qrt" leagueCode="190925" leagueSort="1" leagueType="LEAGUE" startTime="00:00" status="Fin" statustype="fin" type="2" visible="1" lineups="1">
...
</Match>
<Match ct="0" id="5181855" lastPeriod="4Qrt" leagueCode="190925" leagueSort="1" leagueType="LEAGUE" startTime="02:30" status="Fin" statustype="fin" type="2" visible="1" lineups="1">
...
</Match>
</Matchday>
</Sport>
</Export>
И, следуя приведенному примеру, у меня есть эти структурированные данные:
import com.lucidchart.open.xtract.XmlReader._
import com.lucidchart.open.xtract.{XmlReader, __}
import cats.syntax.all._
case class Sport(
code: String,
id: String,
name: String,
hid: String,
lineup_hid: String,
Matchday: Seq[Matchday]
)
object Sport {
implicit val reader: XmlReader[Sport] = (
attribute[String]("code"),
attribute[String]("id"),
attribute[String]("name"),
attribute[String]("hid"),
attribute[String]("lineup_hid"),
(__ \ "Matchday").read(seq[Matchday])
).mapN(apply _)
}
case class Matchday (
date: String,
Matchs: Seq[Match]
)
object Matchday {
implicit val reader: XmlReader[Matchday] = (
attribute[String]("date"),
(__ \ "Match").read(seq[Match])
).mapN(apply _)
}
case class Match (
ct: String,
id: String,
lastPeriod: String,
leagueCode: String,
leagueSort: String,
leagueType: String,
startTime: String,
status: String,
statusType: String,
Type: String,
visible: String,
lineups: String
)
object Match {
implicit val reader: XmlReader[Match] = (
attribute[String]("ct"),
attribute[String]("id"),
attribute[String]("lastPeriod"),
attribute[String]("leagueCode"),
attribute[String]("leagueSort"),
attribute[String]("leagueType"),
attribute[String]("startTime"),
attribute[String]("status"),
attribute[String]("statusType"),
attribute[String]("type"),
attribute[String]("visible"),
attribute[String]("lineups")
).mapN(apply _)
}
case class Export (
Sport: Seq[Sport]
)
object Export {
implicit val reader: XmlReader[Export] = (__ \ "Sport").read(seq[Sport]).default(Nil).map(apply _)
}
и мое основное приложение:
import com.lucidchart.open.xtract.XmlReader
import scala.xml.XML
object MainApp {
val path = "/scorespro.xml"
private val xml = XML.load(getClass.getResourceAsStream(path))
def main(args: Array[String]): Unit = {
println(xml)
val parsedBlog = XmlReader.of[Export].read(xml)
println("Parsed Result:")
println(parsedBlog)
}
}
Но когда япопробуйте мой код, у меня есть это:
*** ОТВЕТ: Некоторые (Экспорт (Вектор (Спорт (SOC, 1, ФУТБОЛ, 13383104,785967, Вектор (День матча) (2019-04-14,Вектор ()))), Спорт (BSK, 3, БАСКЕТБОЛ, 10716464,101838, Вектор (День матча (2019-04-14, Вектор ()))))))
Что бы я ни пытался- изменить атрибут Match или использовать lazyRead - он не хочет обрабатывать теги.
Есть ли шанс, что я здесь что-то делаю совершенно неправильно?