This post demonstrates how to read XML files using DOM Parser which parses and loads the entire XML into memory in a Tree structure which makes it very easy to traverse and manipulate elements.
We are using Kotlin 1.1.
Reading XML files
When reading an XML file using a DOM parser, we create a org.w3c.dom.Document object which represents the XML file whose contents are stored as a tree of elements (technically known as nodes).
XML File – Input File
This is our XML file that’ll be parsed and load into memory by a DOM parser. It’s a copy of books.xml from Microsoft MSDN.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | <?xml version="1.0"?> <catalog> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> <book id="bk102"> <author>Ralls, Kim</author> <title>Midnight Rain</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2000-12-16</publish_date> <description>A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.</description> </book> <book id="bk103"> <author>Corets, Eva</author> <title>Maeve Ascendant</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2000-11-17</publish_date> <description>After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.</description> </book> <book id="bk104"> <author>Corets, Eva</author> <title>Oberon's Legacy</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2001-03-10</publish_date> <description>In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant.</description> </book> <book id="bk105"> <author>Corets, Eva</author> <title>The Sundered Grail</title> <genre>Fantasy</genre> <price>5.95</price> <publish_date>2001-09-10</publish_date> <description>The two daughters of Maeve, half-sisters, battle one another for control of England. Sequel to Oberon's Legacy.</description> </book> <book id="bk106"> <author>Randall, Cynthia</author> <title>Lover Birds</title> <genre>Romance</genre> <price>4.95</price> <publish_date>2000-09-02</publish_date> <description>When Carla meets Paul at an ornithology conference, tempers fly as feathers get ruffled.</description> </book> <book id="bk107"> <author>Thurman, Paula</author> <title>Splish Splash</title> <genre>Romance</genre> <price>4.95</price> <publish_date>2000-11-02</publish_date> <description>A deep sea diver finds true love twenty thousand leagues beneath the sea.</description> </book> <book id="bk108"> <author>Knorr, Stefan</author> <title>Creepy Crawlies</title> <genre>Horror</genre> <price>4.95</price> <publish_date>2000-12-06</publish_date> <description>An anthology of horror stories about roaches, centipedes, scorpions and other insects.</description> </book> <book id="bk109"> <author>Kress, Peter</author> <title>Paradox Lost</title> <genre>Science Fiction</genre> <price>6.95</price> <publish_date>2000-11-02</publish_date> <description>After an inadvertant trip through a Heisenberg Uncertainty Device, James Salway discovers the problems of being quantum.</description> </book> <book id="bk110"> <author>O'Brien, Tim</author> <title>Microsoft .NET: The Programming Bible</title> <genre>Computer</genre> <price>36.95</price> <publish_date>2000-12-09</publish_date> <description>Microsoft's .NET initiative is explored in detail in this deep programmer's reference.</description> </book> <book id="bk111"> <author>O'Brien, Tim</author> <title>MSXML3: A Comprehensive Guide</title> <genre>Computer</genre> <price>36.95</price> <publish_date>2000-12-01</publish_date> <description>The Microsoft MSXML3 parser is covered in detail, with attention to XML DOM interfaces, XSLT processing, SAX and more.</description> </book> <book id="bk112"> <author>Galos, Mike</author> <title>Visual Studio 7: A Comprehensive Guide</title> <genre>Computer</genre> <price>49.95</price> <publish_date>2001-04-16</publish_date> <description>Microsoft Visual Studio 7 is explored in depth, looking at how Visual Basic, Visual C++, C#, and ASP+ are integrated into a comprehensive development environment.</description> </book> </catalog> |
Kotlin Codes – Iterative Traversal
There are no classes here. It is just a Kotlin script with a main function.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | package com.turreta.kotlin.xml.dom import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.Node import org.w3c.dom.NodeList import java.io.File import javax.xml.parsers.DocumentBuilderFactory fun main(args: Array<String>) { val xlmFile: File = File("C:\\Users\\abc\\kotlin-turreta\\kotlin01\\src\\books.xml") val xmlDoc: Document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xlmFile) xmlDoc.documentElement.normalize() println("Root Node:" + xmlDoc.documentElement.nodeName) val bookList: NodeList = xmlDoc.getElementsByTagName("book") for(i in 0..bookList.length - 1) { var bookNode: Node = bookList.item(i) if (bookNode.getNodeType() === Node.ELEMENT_NODE) { val elem = bookNode as Element val mMap = mutableMapOf<String, String>() for(j in 0..elem.attributes.length - 1) { mMap.putIfAbsent(elem.attributes.item(j).nodeName, elem.attributes.item(j).nodeValue) } println("Current Book : ${bookNode.nodeName} - $mMap") println("Author: ${elem.getElementsByTagName("author").item(0).textContent}") println("Title: ${elem.getElementsByTagName("title").item(0).textContent}") println("Genre: ${elem.getElementsByTagName("genre").item(0).textContent}") println("Price: ${elem.getElementsByTagName("price").item(0).textContent}") println("publish_date: ${elem.getElementsByTagName("publish_date").item(0).textContent}") println("description: ${elem.getElementsByTagName("description").item(0).textContent}") } } } |
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | Root Node:catalog Current Book : book - {id=bk101} Author: Gambardella, Matthew Title: XML Developer's Guide Genre: Computer Price: 44.95 publish_date: 2000-10-01 description: An in-depth look at creating applications with XML. Current Book : book - {id=bk102} Author: Ralls, Kim Title: Midnight Rain Genre: Fantasy Price: 5.95 publish_date: 2000-12-16 description: A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world. Current Book : book - {id=bk103} Author: Corets, Eva Title: Maeve Ascendant Genre: Fantasy Price: 5.95 publish_date: 2000-11-17 description: After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society. Current Book : book - {id=bk104} Author: Corets, Eva Title: Oberon's Legacy Genre: Fantasy Price: 5.95 publish_date: 2001-03-10 description: In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant. Current Book : book - {id=bk105} Author: Corets, Eva Title: The Sundered Grail Genre: Fantasy Price: 5.95 publish_date: 2001-09-10 description: The two daughters of Maeve, half-sisters, battle one another for control of England. Sequel to Oberon's Legacy. Current Book : book - {id=bk106} Author: Randall, Cynthia Title: Lover Birds Genre: Romance Price: 4.95 publish_date: 2000-09-02 description: When Carla meets Paul at an ornithology conference, tempers fly as feathers get ruffled. Current Book : book - {id=bk107} Author: Thurman, Paula Title: Splish Splash Genre: Romance Price: 4.95 publish_date: 2000-11-02 description: A deep sea diver finds true love twenty thousand leagues beneath the sea. Current Book : book - {id=bk108} Author: Knorr, Stefan Title: Creepy Crawlies Genre: Horror Price: 4.95 publish_date: 2000-12-06 description: An anthology of horror stories about roaches, centipedes, scorpions and other insects. Current Book : book - {id=bk109} Author: Kress, Peter Title: Paradox Lost Genre: Science Fiction Price: 6.95 publish_date: 2000-11-02 description: After an inadvertant trip through a Heisenberg Uncertainty Device, James Salway discovers the problems of being quantum. Current Book : book - {id=bk110} Author: O'Brien, Tim Title: Microsoft .NET: The Programming Bible Genre: Computer Price: 36.95 publish_date: 2000-12-09 description: Microsoft's .NET initiative is explored in detail in this deep programmer's reference. Current Book : book - {id=bk111} Author: O'Brien, Tim Title: MSXML3: A Comprehensive Guide Genre: Computer Price: 36.95 publish_date: 2000-12-01 description: The Microsoft MSXML3 parser is covered in detail, with attention to XML DOM interfaces, XSLT processing, SAX and more. Current Book : book - {id=bk112} Author: Galos, Mike Title: Visual Studio 7: A Comprehensive Guide Genre: Computer Price: 49.95 publish_date: 2001-04-16 description: Microsoft Visual Studio 7 is explored in depth, looking at how Visual Basic, Visual C++, C#, and ASP+ are integrated into a comprehensive development environment. |
Kotlin Codes – Recursive Traversal
Notice that we created a DomRecursiveTraverse class that has a method that traverses a DOM object from a Node object starting point.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | package com.turreta.kotlin.xml.dom import org.w3c.dom.Document import org.w3c.dom.Node import org.w3c.dom.NodeList import java.io.File import javax.xml.parsers.DocumentBuilderFactory object DomRecursiveTraverse { fun recursiveTraverse(node: Node) { println(node.nodeName) if (node.attributes != null) { // Write out the element's attributes for (i in 0..node.attributes.length - 1) { println("Attribute::" + node.attributes.item(i).nodeName + " | " + node.attributes.item(i).nodeValue) } } val nodeList: NodeList = node.childNodes for (i in 0..nodeList.length - 1) { val currentNode: Node = nodeList.item(i) if (currentNode.nodeType == Node.ELEMENT_NODE) { //calls this method for all the children which is Element recursiveTraverse(currentNode) } if (currentNode.nodeType == Node.TEXT_NODE) { println("Text value::" + currentNode.textContent) } } println("END::" + node.nodeName) } } fun main(args: Array<String>) { val xlmFile: File = File("C:\\Users\\abc\\kotlin-turreta\\kotlin01\\src\\books.xml") val xmlDoc: Document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xlmFile) xmlDoc.documentElement.normalize() println("Root Node:" + xmlDoc.documentElement.nodeName) val bookList: NodeList = xmlDoc.getElementsByTagName("book") for(i in 0..bookList.length - 1) { var bookNode: Node = bookList.item(i) DomRecursiveTraverse.recursiveTraverse(bookNode) } } |
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 | Root Node:catalog book Attribute::id | bk101 Text value:: author Text value::Gambardella, Matthew END::author Text value:: title Text value::XML Developer's Guide END::title Text value:: genre Text value::Computer END::genre Text value:: price Text value::44.95 END::price Text value:: publish_date Text value::2000-10-01 END::publish_date Text value:: description Text value::An in-depth look at creating applications with XML. END::description Text value:: END::book book Attribute::id | bk102 Text value:: author Text value::Ralls, Kim END::author Text value:: title Text value::Midnight Rain END::title Text value:: genre Text value::Fantasy END::genre Text value:: price Text value::5.95 END::price Text value:: publish_date Text value::2000-12-16 END::publish_date Text value:: description Text value::A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world. END::description Text value:: END::book book Attribute::id | bk103 Text value:: author Text value::Corets, Eva END::author Text value:: title Text value::Maeve Ascendant END::title Text value:: genre Text value::Fantasy END::genre Text value:: price Text value::5.95 END::price Text value:: publish_date Text value::2000-11-17 END::publish_date Text value:: description Text value::After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society. END::description Text value:: END::book book Attribute::id | bk104 Text value:: author Text value::Corets, Eva END::author Text value:: title Text value::Oberon's Legacy END::title Text value:: genre Text value::Fantasy END::genre Text value:: price Text value::5.95 END::price Text value:: publish_date Text value::2001-03-10 END::publish_date Text value:: description Text value::In post-apocalypse England, the mysterious agent known only as Oberon helps to create a new life for the inhabitants of London. Sequel to Maeve Ascendant. END::description Text value:: END::book book Attribute::id | bk105 Text value:: author Text value::Corets, Eva END::author Text value:: title Text value::The Sundered Grail END::title Text value:: genre Text value::Fantasy END::genre Text value:: price Text value::5.95 END::price Text value:: publish_date Text value::2001-09-10 END::publish_date Text value:: description Text value::The two daughters of Maeve, half-sisters, battle one another for control of England. Sequel to Oberon's Legacy. END::description Text value:: END::book book Attribute::id | bk106 Text value:: author Text value::Randall, Cynthia END::author Text value:: title Text value::Lover Birds END::title Text value:: genre Text value::Romance END::genre Text value:: price Text value::4.95 END::price Text value:: publish_date Text value::2000-09-02 END::publish_date Text value:: description Text value::When Carla meets Paul at an ornithology conference, tempers fly as feathers get ruffled. END::description Text value:: END::book book Attribute::id | bk107 Text value:: author Text value::Thurman, Paula END::author Text value:: title Text value::Splish Splash END::title Text value:: genre Text value::Romance END::genre Text value:: price Text value::4.95 END::price Text value:: publish_date Text value::2000-11-02 END::publish_date Text value:: description Text value::A deep sea diver finds true love twenty thousand leagues beneath the sea. END::description Text value:: END::book book Attribute::id | bk108 Text value:: author Text value::Knorr, Stefan END::author Text value:: title Text value::Creepy Crawlies END::title Text value:: genre Text value::Horror END::genre Text value:: price Text value::4.95 END::price Text value:: publish_date Text value::2000-12-06 END::publish_date Text value:: description Text value::An anthology of horror stories about roaches, centipedes, scorpions and other insects. END::description Text value:: END::book book Attribute::id | bk109 Text value:: author Text value::Kress, Peter END::author Text value:: title Text value::Paradox Lost END::title Text value:: genre Text value::Science Fiction END::genre Text value:: price Text value::6.95 END::price Text value:: publish_date Text value::2000-11-02 END::publish_date Text value:: description Text value::After an inadvertant trip through a Heisenberg Uncertainty Device, James Salway discovers the problems of being quantum. END::description Text value:: END::book book Attribute::id | bk110 Text value:: author Text value::O'Brien, Tim END::author Text value:: title Text value::Microsoft .NET: The Programming Bible END::title Text value:: genre Text value::Computer END::genre Text value:: price Text value::36.95 END::price Text value:: publish_date Text value::2000-12-09 END::publish_date Text value:: description Text value::Microsoft's .NET initiative is explored in detail in this deep programmer's reference. END::description Text value:: END::book book Attribute::id | bk111 Text value:: author Text value::O'Brien, Tim END::author Text value:: title Text value::MSXML3: A Comprehensive Guide END::title Text value:: genre Text value::Computer END::genre Text value:: price Text value::36.95 END::price Text value:: publish_date Text value::2000-12-01 END::publish_date Text value:: description Text value::The Microsoft MSXML3 parser is covered in detail, with attention to XML DOM interfaces, XSLT processing, SAX and more. END::description Text value:: END::book book Attribute::id | bk112 Text value:: author Text value::Galos, Mike END::author Text value:: title Text value::Visual Studio 7: A Comprehensive Guide END::title Text value:: genre Text value::Computer END::genre Text value:: price Text value::49.95 END::price Text value:: publish_date Text value::2001-04-16 END::publish_date Text value:: description Text value::Microsoft Visual Studio 7 is explored in depth, looking at how Visual Basic, Visual C++, C#, and ASP+ are integrated into a comprehensive development environment. END::description Text value:: END::book |
References