(dom: XmlDocument)
| 185 | } |
| 186 | |
| 187 | private _parseDom(dom: XmlDocument): void { |
| 188 | const root: XmlNode | null = dom.firstElement; |
| 189 | if (!root) { |
| 190 | return; |
| 191 | } |
| 192 | // the XML uses IDs for referring elements within the |
| 193 | // Therefore we do the parsing in 2 steps: |
| 194 | // - at first we read all model elements and store them by ID in a lookup table |
| 195 | // - after that we need to join up the information. |
| 196 | if (root.localName === 'GPIF') { |
| 197 | this.score = new Score(); |
| 198 | // parse all children |
| 199 | for (const n of root.childElements()) { |
| 200 | switch (n.localName) { |
| 201 | case 'Score': |
| 202 | this._parseScoreNode(n); |
| 203 | break; |
| 204 | case 'MasterTrack': |
| 205 | this._parseMasterTrackNode(n); |
| 206 | break; |
| 207 | case 'BackingTrack': |
| 208 | this._parseBackingTrackNode(n); |
| 209 | break; |
| 210 | case 'Tracks': |
| 211 | this._parseTracksNode(n); |
| 212 | break; |
| 213 | case 'MasterBars': |
| 214 | this._parseMasterBarsNode(n); |
| 215 | break; |
| 216 | case 'Bars': |
| 217 | this._parseBars(n); |
| 218 | break; |
| 219 | case 'Voices': |
| 220 | this._parseVoices(n); |
| 221 | break; |
| 222 | case 'Beats': |
| 223 | this._parseBeats(n); |
| 224 | break; |
| 225 | case 'Notes': |
| 226 | this._parseNotes(n); |
| 227 | break; |
| 228 | case 'Rhythms': |
| 229 | this._parseRhythms(n); |
| 230 | break; |
| 231 | case 'Assets': |
| 232 | this._parseAssets(n); |
| 233 | break; |
| 234 | } |
| 235 | } |
| 236 | } else { |
| 237 | throw new UnsupportedFormatError('Root node of XML was not GPIF'); |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | private _parseAssets(element: XmlNode) { |
| 242 | for (const c of element.childElements()) { |
no test coverage detected