Advertisement
JachyHm

SJR XML parser

Jun 27th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 23.43 KB | None | 0 0
  1. package com.jachyhm.sjrregiojet
  2.  
  3. import android.util.Xml
  4. import org.xmlpull.v1.XmlPullParser
  5. import org.xmlpull.v1.XmlPullParserException
  6. import java.io.IOException
  7. import java.io.InputStream
  8. import java.io.SerializablePermission
  9. import java.util.*
  10.  
  11. val TRAIN_TYPES = arrayOf(
  12.     "",
  13.     "Ruš.",
  14.     "Zvl."
  15. )
  16.  
  17. val TRAIN_KINDS = arrayOf(
  18.     "NEx",
  19.     "Rn",
  20.     "Pn",
  21.     "Vn",
  22.     "Mn",
  23.     "Lv",
  24.     "Vleč.",
  25.     "LvZk",
  26.     "Služ.",
  27.     "EC",
  28.     "IC",
  29.     "Ex",
  30.     "R",
  31.     "Sp",
  32.     "Os",
  33.     "Sv",
  34.     "EN"
  35. )
  36.  
  37. data class Route(
  38.     val track_sections: List<TrackSection>
  39. )
  40.  
  41. data class TrackSection(
  42.     val D3: Boolean,
  43.     val timetable_entries: List<TimetableEntry>
  44. )
  45.  
  46. data class TimetableEntry(
  47.     val position: Float,
  48.     val radioChannel: String,
  49.     val maxSpeed: Int,
  50.     val gps_loc: GPSLocation,
  51.     val train_type: String,
  52.     val train_kind: String,
  53.     val train_number: Int,
  54.     val point_name: String,
  55.     val stopping: Boolean,
  56.     val arrival: TimetableTime?,
  57.     val departure: TimetableTime,
  58.     val travel_time: TimetableTime,
  59.     val brake_percents_id: Int?,
  60.     val SR70: String,
  61.     val symbol_notes: SymbolNotes,
  62.     val noteIDs: MutableList<Int>,
  63.     val trains: MutableList<Int>,
  64.     val track: Int?
  65. )
  66.  
  67. data class SymbolNotes(
  68.     var col1: MutableList<Int> = mutableListOf(),
  69.     var col2: MutableList<Int> = mutableListOf(),
  70.     var col2a: MutableList<Int> = mutableListOf(),
  71.     var col3: MutableList<Int> = mutableListOf(),
  72.     var col4: MutableList<Int> = mutableListOf(),
  73.     var col5: MutableList<Int> = mutableListOf(),
  74.     var col6: MutableList<Int> = mutableListOf(),
  75.     var col7: MutableList<Int> = mutableListOf(),
  76.     var col8: MutableList<Int> = mutableListOf(),
  77.     var col10: MutableList<Int> = mutableListOf()
  78. )
  79.  
  80. data class GPSLocation(
  81.     val lat: String,
  82.     val lat_type: String,
  83.     val lon: String,
  84.     val lon_type: String
  85. )
  86.  
  87. data class TimetableTime(
  88.     val hours: Int,
  89.     val minutes: Int,
  90.     val seconds: Int
  91. )
  92.  
  93. data class Instruction(
  94.     val type: Int,
  95.     val text: String
  96. )
  97.  
  98. data class SharedAttributes(
  99.     val train_types: List<String>,
  100.     val train_kinds: List<String>,
  101.     val train_loco: List<LocoAsset>,
  102.     val notes: List<Note>,
  103.     val brake_percents: MutableMap<Int,BrakePercent>
  104. )
  105.  
  106. data class Note(
  107.     val ID: Int,
  108.     val station: String,
  109.     val content: String,
  110.     val pict_id: Int? = null,
  111.     val train_number: Int? = null
  112. )
  113.  
  114. data class BrakePercent(
  115.     val speed: Int,
  116.     val percent1: Int,
  117.     val percent2: Int?
  118. )
  119.  
  120. data class LocoAsset(
  121.     val ID: Int,
  122.     val name: String,
  123.     val validity: CharArray
  124. )
  125.  
  126. data class Timetable(
  127.     val route: Route?,
  128.     val instructions: List<Instruction>?,
  129.     val shared_attributes: SharedAttributes?,
  130.     val col2a: Boolean?,
  131.     val col10: Boolean?
  132. )
  133.  
  134. private fun makeTimetableTime(input: String?): TimetableTime? {
  135.     if (input != null) {
  136.         val s = input.split(":")
  137.         return TimetableTime(s[0].toInt(), s[1].toInt(), s[2].toInt())
  138.     }
  139.     return null
  140. }
  141.  
  142. data class TempNote(
  143.     val pict_id: Int?,
  144.     val station_name: String,
  145.     val train_number: Int?
  146. )
  147.  
  148. var notePics = mutableMapOf<Int, TempNote>()
  149.  
  150. var col2a = false
  151. var col10 = false
  152.  
  153. class TimetableXmlParser {
  154.     @Throws(XmlPullParserException::class, IOException::class)
  155.     fun parse(inputStream: InputStream): Timetable? {
  156.         inputStream.use { inputStream ->
  157.             val parser: XmlPullParser = Xml.newPullParser()
  158.             parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
  159.             parser.setInput(inputStream, null)
  160.             //parser.nextTag()
  161.             return readXML(parser)
  162.         }
  163.     }
  164.  
  165.     @Throws(XmlPullParserException::class, IOException::class)
  166.     private fun readXML(parser: XmlPullParser): Timetable? {
  167.         //parser.require(XmlPullParser.START_TAG, null, "ETDTimetable")
  168.         var timetable: Timetable? = null
  169.         while (parser.next() != XmlPullParser.END_TAG && parser.eventType != XmlPullParser.END_DOCUMENT) {
  170.             if (parser.eventType != XmlPullParser.START_TAG) {
  171.                 continue
  172.             }
  173.             // Starts by looking for the entry tag
  174.             if (parser.name == "ETDTimetable") {
  175.                 timetable = readETDT(parser)
  176.             } else {
  177.                 skip(parser)
  178.             }
  179.         }
  180.         return timetable
  181.     }
  182.  
  183.     @Throws(XmlPullParserException::class, IOException::class)
  184.     private fun readETDT(parser: XmlPullParser): Timetable? {
  185.         parser.require(XmlPullParser.START_TAG, null, "ETDTimetable")
  186.         var route: Route? = null
  187.         var instructions: List<Instruction>? = null
  188.         var shared_attributes: SharedAttributes? = null
  189.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "ETDTimetable") {
  190.             if (parser.eventType != XmlPullParser.START_TAG) {
  191.                 continue
  192.             }
  193.             when (parser.name) {
  194.                 "Route" -> route = readRoute(parser)
  195.                 "Instructions" -> instructions = readInstructions(parser)
  196.                 "SharedAttributes" -> shared_attributes = readSharedAttributes(parser)
  197.                 else -> skip(parser)
  198.             }
  199.         }
  200.         parser.require(XmlPullParser.END_TAG, null, "ETDTimetable")
  201.         return Timetable(route, instructions, shared_attributes, col2a, col10)
  202.     }
  203.  
  204.     // Processes Route tags in the feed.
  205.     @Throws(IOException::class, XmlPullParserException::class)
  206.     private fun readRoute(parser: XmlPullParser): Route? {
  207.         parser.require(XmlPullParser.START_TAG, null, "Route")
  208.         val track_sections = mutableListOf<TrackSection>()
  209.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "Route") {
  210.             if (parser.eventType != XmlPullParser.START_TAG) {
  211.                 continue
  212.             }
  213.             if (parser.name == "TrackSection") {
  214.                 track_sections.add(readTrackSection(parser))
  215.             } else {
  216.                 skip(parser)
  217.             }
  218.         }
  219.         parser.require(XmlPullParser.END_TAG, null, "Route")
  220.         return Route(track_sections)
  221.     }
  222.  
  223.     // Processes TrackSection section tags in the feed.
  224.     @Throws(IOException::class, XmlPullParserException::class)
  225.     private fun readTrackSection(parser: XmlPullParser): TrackSection {
  226.         parser.require(XmlPullParser.START_TAG, null, "TrackSection")
  227.         var D3 = false
  228.         val tt_entries = mutableListOf<TimetableEntry>()
  229.  
  230.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "TrackSection") {
  231.             if (parser.eventType != XmlPullParser.START_TAG) {
  232.                 continue
  233.             }
  234.             if (parser.name == "Track") {
  235.                 if (parser.getAttributeValue(null, "TrackType") == "primary") {
  236.                     if (parser.getAttributeValue(null, "D3") == "true") {
  237.                         D3 = true
  238.                     }
  239.                     while (parser.next() != XmlPullParser.END_TAG) {
  240.                         if (parser.eventType != XmlPullParser.START_TAG) {
  241.                             continue
  242.                         }
  243.                         if (parser.name == "TimetableEntry") {
  244.                             tt_entries.add(readTimetableEntry(parser))
  245.                         } else {
  246.                             skip(parser)
  247.                         }
  248.                     }
  249.                 } else {
  250.                     skip(parser)
  251.                 }
  252.             } else {
  253.                 skip(parser)
  254.             }
  255.         }
  256.         parser.require(XmlPullParser.END_TAG, null, "TrackSection")
  257.         return TrackSection(D3, tt_entries)
  258.     }
  259.  
  260.     // Processes TimetableEntry section tags in the feed.
  261.     @Throws(IOException::class, XmlPullParserException::class)
  262.     private fun readTimetableEntry(parser: XmlPullParser): TimetableEntry {
  263.         parser.require(XmlPullParser.START_TAG, null, "TimetableEntry")
  264.         var position = 0f
  265.         var radioChannel = ""
  266.         var maxSpeed = 0
  267.         var gps_loc = GPSLocation("", "", "", "")
  268.         var train_type = ""
  269.         var train_kind = ""
  270.         var train_number = 0
  271.         var point_name = ""
  272.         var stopping = false
  273.         var arrival: TimetableTime? = null
  274.         var departure = TimetableTime(0,0,0)
  275.         var travel_time = TimetableTime(0,0,0)
  276.         var brake_percents_id: Int? = null
  277.         var SR70 = ""
  278.         var symbol_notes = SymbolNotes()
  279.         val noteIDs: MutableList<Int> = mutableListOf()
  280.         val trains: MutableList<Int> = mutableListOf()
  281.         var track: Int? = null
  282.  
  283.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "TimetableEntry") {
  284.             if (parser.eventType != XmlPullParser.START_TAG) {
  285.                 continue
  286.             }
  287.             when(parser.name) {
  288.                 "EntryHeader" -> {
  289.                     position = parser.getAttributeValue(null, "kmPos").toFloat()
  290.                     radioChannel = parser.getAttributeValue(null, "RadioChannel")
  291.                     maxSpeed = parser.getAttributeValue(null, "Speed").toInt()
  292.                     gps_loc = GPSLocation(
  293.                         parser.getAttributeValue(null, "GPSLatitude"),
  294.                         parser.getAttributeValue(null, "GPSLatitudeDir"),
  295.                         parser.getAttributeValue(null, "GPSLongitude"),
  296.                         parser.getAttributeValue(null, "GPSLongitudeDir")
  297.                     )
  298.                     train_type = TRAIN_TYPES[parser.getAttributeValue(null, "TrainTypeId").toInt()-1]
  299.                     train_kind = TRAIN_KINDS[parser.getAttributeValue(null, "KindOfTrainId").toInt()-1]
  300.                     train_number = parser.getAttributeValue(null, "TrainNumber").toInt()
  301.                 }
  302.  
  303.                 "Station" -> {
  304.                     point_name = parser.getAttributeValue(null, "Name")
  305.                     if (parser.getAttributeValue(null, "TypePass") == "stop") {
  306.                         stopping = true
  307.                     }
  308.                     arrival = makeTimetableTime(parser.getAttributeValue(null, "Arrival"))
  309.                     val _departure = parser.getAttributeValue(null, "Departure")
  310.                     if (_departure != null) {
  311.                         departure = checkNotNull(makeTimetableTime(_departure))
  312.                     }
  313.  
  314.                     val _travel_time = parser.getAttributeValue(null, "TimeTravel")
  315.                     if (_travel_time != null) {
  316.                         travel_time = checkNotNull(makeTimetableTime(_travel_time))
  317.                     }
  318.  
  319.                     brake_percents_id = parser.getAttributeValue(null, "BrakePercentsId").toInt()
  320.                     SR70 = parser.getAttributeValue(null, "SR70")
  321.  
  322.                     val _track = parser.getAttributeValue(null, "Track")
  323.                     if(_track != null) {
  324.                         col2a = true
  325.                         track = _track.toInt()
  326.                     }
  327.                 }
  328.  
  329.                 "SymbolNotes" -> {
  330.                     symbol_notes = readSymbolNotes(parser, point_name)
  331.                 }
  332.  
  333.                 "Trains" -> {
  334.                     while (parser.next() != XmlPullParser.END_TAG) {
  335.                         if (parser.eventType != XmlPullParser.START_TAG) {
  336.                             continue
  337.                         }
  338.                         if (parser.name == "Train") {
  339.                             col10 = true
  340.                             trains.add(parser.getAttributeValue(null, "TrainNumber").toInt())
  341.                             if (parser.getAttributeValue(null, "NoteId") != null) {
  342.                                 notePics[parser.getAttributeValue(null, "NoteId").toInt()] = TempNote(null, point_name, parser.getAttributeValue(null, "TrainNumber").toInt())
  343.                             }
  344.                         }
  345.                     }
  346.                 }
  347.  
  348.                 else -> skip(parser)
  349.             }
  350.         }
  351.         parser.require(XmlPullParser.END_TAG, null, "TimetableEntry")
  352.         return TimetableEntry(
  353.             position,
  354.             radioChannel,
  355.             maxSpeed,
  356.             gps_loc,
  357.             train_type,
  358.             train_kind,
  359.             train_number,
  360.             point_name,
  361.             stopping,
  362.             arrival,
  363.             departure,
  364.             travel_time,
  365.             brake_percents_id,
  366.             SR70,
  367.             symbol_notes,
  368.             noteIDs,
  369.             trains,
  370.             track
  371.         )
  372.     }
  373.  
  374.     // Processes EVId tags in the feed.
  375.     @Throws(IOException::class, XmlPullParserException::class)
  376.     private fun readSymbolNotes(parser: XmlPullParser, station_name: String): SymbolNotes {
  377.         parser.require(XmlPullParser.START_TAG, null, "SymbolNotes")
  378.         val symbol_notes = SymbolNotes()
  379.  
  380.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "SymbolNotes") {
  381.             if (parser.eventType != XmlPullParser.START_TAG) {
  382.                 continue
  383.             }
  384.             if (parser.name == "SymbolNote") {
  385.                 if (parser.getAttributeValue(null, "NoteId") != null) {
  386.                     notePics[parser.getAttributeValue(null, "NoteId").toInt()] = TempNote(parser.getAttributeValue(null, "PictId").toInt(), station_name, null)
  387.                 }
  388.                 when(parser.getAttributeValue(null, "SymbolPosition")) {
  389.                     "Col1" -> {
  390.                         symbol_notes.col1.add(parser.getAttributeValue(null, "PictId").toInt())
  391.                     }
  392.                     "Col2" -> {
  393.                         symbol_notes.col2.add(parser.getAttributeValue(null, "PictId").toInt())
  394.                     }
  395.                     "Col2a" -> {
  396.                         symbol_notes.col2a.add(parser.getAttributeValue(null, "PictId").toInt())
  397.                     }
  398.                     "Col3" -> {
  399.                         symbol_notes.col3.add(parser.getAttributeValue(null, "PictId").toInt())
  400.                     }
  401.                     "Col4" -> {
  402.                         symbol_notes.col4.add(parser.getAttributeValue(null, "PictId").toInt())
  403.                     }
  404.                     "Col5" -> {
  405.                         symbol_notes.col5.add(parser.getAttributeValue(null, "PictId").toInt())
  406.                     }
  407.                     "Col6" -> {
  408.                         symbol_notes.col6.add(parser.getAttributeValue(null, "PictId").toInt())
  409.                     }
  410.                     "Col7" -> {
  411.                         symbol_notes.col7.add(parser.getAttributeValue(null, "PictId").toInt())
  412.                     }
  413.                     "Col8" -> {
  414.                         symbol_notes.col8.add(parser.getAttributeValue(null, "PictId").toInt())
  415.                     }
  416.                     "Col10" -> {
  417.                         symbol_notes.col10.add(parser.getAttributeValue(null, "PictId").toInt())
  418.                     }
  419.                 }
  420.             } else {
  421.                 skip(parser)
  422.             }
  423.         }
  424.         parser.require(XmlPullParser.END_TAG, null, "SymbolNotes")
  425.         return symbol_notes
  426.     }
  427.  
  428.     // Processes link tags in the feed.
  429.     @Throws(IOException::class, XmlPullParserException::class)
  430.     private fun readInstructions(parser: XmlPullParser): List<Instruction> {
  431.         parser.require(XmlPullParser.START_TAG, null, "Instructions")
  432.         val instructions: MutableList<Instruction> = mutableListOf()
  433.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "Instructions") {
  434.             if (parser.eventType != XmlPullParser.START_TAG) {
  435.                 continue
  436.             }
  437.             if (parser.name == "Instruction") {
  438.                 instructions.add(Instruction(0, parser.getAttributeValue(null, "Text")))
  439.             } else {
  440.                 skip(parser)
  441.             }
  442.         }
  443.         parser.require(XmlPullParser.END_TAG, null, "Instructions")
  444.         return instructions
  445.     }
  446.  
  447.     // Processes summary tags in the feed.
  448.     @Throws(IOException::class, XmlPullParserException::class)
  449.     private fun readSharedAttributes(parser: XmlPullParser): SharedAttributes {
  450.         parser.require(XmlPullParser.START_TAG, null, "SharedAttributes")
  451.         var train_types: MutableList<String> = mutableListOf()
  452.         var train_kinds: MutableList<String> = mutableListOf()
  453.         var train_loco: MutableList<LocoAsset> = mutableListOf()
  454.         var notes: MutableList<Note> = mutableListOf()
  455.         var brake_percents: MutableMap<Int,BrakePercent> = mutableMapOf()
  456.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "SharedAttributes") {
  457.             if (parser.eventType != XmlPullParser.START_TAG) {
  458.                 continue
  459.             }
  460.             when (parser.name) {
  461.                 "TrainTypes" -> {
  462.                     train_types = readTrainTypes(parser)
  463.                 }
  464.                 "KindsOfTrain" -> {
  465.                     train_kinds = readKindsOfTrain(parser)
  466.                 }
  467.                 "EVs" -> {
  468.                     train_loco = readEVs(parser)
  469.                 }
  470.                 "Notes" -> {
  471.                     notes = readNotes(parser)
  472.                 }
  473.                 "BrakePercentsRow" -> {
  474.                     brake_percents = readBrakePercentsRow(parser)
  475.                 }
  476.                 else -> skip(parser)
  477.             }
  478.         }
  479.         parser.require(XmlPullParser.END_TAG, null, "SharedAttributes")
  480.         return SharedAttributes(train_types, train_kinds, train_loco, notes, brake_percents)
  481.     }
  482.  
  483.     // Processes link tags in the feed.
  484.     @Throws(IOException::class, XmlPullParserException::class)
  485.     private fun readTrainTypes(parser: XmlPullParser): MutableList<String> {
  486.         parser.require(XmlPullParser.START_TAG, null, "TrainTypes")
  487.         val train_types: MutableList<String> = mutableListOf()
  488.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "TrainTypes") {
  489.             if (parser.eventType != XmlPullParser.START_TAG) {
  490.                 continue
  491.             }
  492.             if (parser.name == "TrainType") {
  493.                 train_types.add(TRAIN_TYPES[parser.getAttributeValue(null, "Id").toInt()-1])
  494.             } else {
  495.                 skip(parser)
  496.             }
  497.         }
  498.         parser.require(XmlPullParser.END_TAG, null, "TrainTypes")
  499.         return train_types
  500.     }
  501.  
  502.     // Processes link tags in the feed.
  503.     @Throws(IOException::class, XmlPullParserException::class)
  504.     private fun readKindsOfTrain(parser: XmlPullParser): MutableList<String> {
  505.         parser.require(XmlPullParser.START_TAG, null, "KindsOfTrain")
  506.         val kinds_of_train: MutableList<String> = mutableListOf()
  507.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "KindsOfTrain") {
  508.             if (parser.eventType != XmlPullParser.START_TAG) {
  509.                 continue
  510.             }
  511.             if (parser.name == "KindOfTrain") {
  512.                 kinds_of_train.add(TRAIN_KINDS[parser.getAttributeValue(null, "Id").toInt()-1])
  513.             } else {
  514.                 skip(parser)
  515.             }
  516.         }
  517.         parser.require(XmlPullParser.END_TAG, null, "KindsOfTrain")
  518.         return kinds_of_train
  519.     }
  520.  
  521.     // Processes link tags in the feed.
  522.     @Throws(IOException::class, XmlPullParserException::class)
  523.     private fun readEVs(parser: XmlPullParser): MutableList<LocoAsset> {
  524.         parser.require(XmlPullParser.START_TAG, null, "EVs")
  525.         val evs: MutableList<LocoAsset> = mutableListOf()
  526.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "EVs") {
  527.             if (parser.eventType != XmlPullParser.START_TAG) {
  528.                 continue
  529.             }
  530.             if (parser.name == "EV") {
  531.                 evs.add(LocoAsset(parser.getAttributeValue(null, "Id").toInt(), parser.getAttributeValue(null, "EVClass"), parser.getAttributeValue(null, "BitmapDays").toCharArray()))
  532.             } else {
  533.                 skip(parser)
  534.             }
  535.         }
  536.         parser.require(XmlPullParser.END_TAG, null, "EVs")
  537.         return evs
  538.     }
  539.  
  540.     // Processes link tags in the feed.
  541.     @Throws(IOException::class, XmlPullParserException::class)
  542.     private fun readNotes(parser: XmlPullParser): MutableList<Note> {
  543.         parser.require(XmlPullParser.START_TAG, null, "Notes")
  544.         val notes: MutableList<Note> = mutableListOf()
  545.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "Notes") {
  546.             if (parser.eventType != XmlPullParser.START_TAG) {
  547.                 continue
  548.             }
  549.             if (parser.name == "Note") {
  550.                 val notePic = notePics[parser.getAttributeValue(null, "Id").toInt()]
  551.                 if (notePic != null) {
  552.                     if (notePic.pict_id != null) {
  553.                         notes.add(
  554.                             Note(
  555.                                 parser.getAttributeValue(null, "Id").toInt(),
  556.                                 notePic.station_name,
  557.                                 parser.getAttributeValue(null, "Text"),
  558.                                 notePic.pict_id
  559.                                 )
  560.                         )
  561.                     } else {
  562.                         notes.add(
  563.                             Note(
  564.                                 parser.getAttributeValue(null, "Id").toInt(),
  565.                                 notePic.station_name,
  566.                                 parser.getAttributeValue(null, "Text"),
  567.                                 null,
  568.                                 notePic.train_number
  569.                             )
  570.                         )
  571.                     }
  572.                 }
  573.             } else {
  574.                 skip(parser)
  575.             }
  576.         }
  577.         parser.require(XmlPullParser.END_TAG, null, "Notes")
  578.         return notes
  579.     }
  580.  
  581.     // Processes link tags in the feed.
  582.     @Throws(IOException::class, XmlPullParserException::class)
  583.     private fun readBrakePercentsRow(parser: XmlPullParser): MutableMap<Int,BrakePercent> {
  584.         parser.require(XmlPullParser.START_TAG, null, "BrakePercentsRow")
  585.         val brake_percents: MutableMap<Int,BrakePercent> = mutableMapOf()
  586.         while (parser.next() != XmlPullParser.END_TAG || parser.name != "BrakePercentsRow") {
  587.             if (parser.eventType != XmlPullParser.START_TAG) {
  588.                 continue
  589.             }
  590.             if (parser.name == "BrakePercentRow") {
  591.                 val _bp2 = parser.getAttributeValue(null, "BrakePercent2")
  592.                 var bp2: Int? = null
  593.                 if(_bp2 != null) {
  594.                     bp2 = _bp2.toInt()
  595.                 }
  596.                 brake_percents[parser.getAttributeValue(null, "Id").toInt()] = (
  597.                     BrakePercent(
  598.                         parser.getAttributeValue(null, "TrainSpeed").toInt(),
  599.                         parser.getAttributeValue(null, "BrakePercent1").toInt(),
  600.                         bp2
  601.                     )
  602.                 )
  603.             } else {
  604.                 skip(parser)
  605.             }
  606.         }
  607.         parser.require(XmlPullParser.END_TAG, null, "BrakePercentsRow")
  608.         return brake_percents
  609.     }
  610.  
  611.     @Throws(XmlPullParserException::class, IOException::class)
  612.     private fun skip(parser: XmlPullParser) {
  613.         if (parser.eventType != XmlPullParser.START_TAG) {
  614.             throw IllegalStateException()
  615.         }
  616.         var depth = 1
  617.         while (depth != 0) {
  618.             when (parser.next()) {
  619.                 XmlPullParser.END_TAG -> depth--
  620.                 XmlPullParser.START_TAG -> depth++
  621.             }
  622.         }
  623.     }
  624. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement