Разбор xml с xtract не работает с вложенным случаем - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь использовать библиотеку 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 - он не хочет обрабатывать теги.

Есть ли шанс, что я здесь что-то делаю совершенно неправильно?

...