In this tutorial we will see how to read and parse an XML (eXtensible Markup Language) file using Java code following the DOM (Document Object Model) Parser under javax.xml.parsers.
❗️ Be aware that DOM XML Parser in Java does consume a lot of memory resources as it creates a Document Object of the entire XML in the memory (RAM) and hence it is also slow. You should be using DOM parser only when the XML file size is relatively less. If you have a huge file you must use the SAX Parser is recommended.
Sample XML file to be parsed using DOM parser
<?xml version="1.0"?>
<Countries>
<Country>
<name>United States</name>
<alpha_code>USA</alpha_code>
<population>328,239,523</population>
<primary_language>English</primary_language>
</Country>
<Country>
<name>Australia</name>
<alpha_code>AUS</alpha_code>
<population>25,019,600</population>
<primary_language>English</primary_language>
</Country>
<Country>
<name>New Zealand</name>
<alpha_code>NZL</alpha_code>
<population>4,893,830</population>
<primary_language>English</primary_language>
</Country>
<Country>
<name>United Kingdom</name>
<alpha_code>GBR</alpha_code>
<population>66,040,229</population>
<primary_language>English</primary_language>
</Country>
<Country>
<name>Ireland</name>
<alpha_code>IRL</alpha_code>
<population>4,900,000</population>
<primary_language>English</primary_language>
</Country>
<Country>
<name>Canada</name>
<alpha_code>CAN</alpha_code>
<population>35,985,751</population>
<primary_language>English</primary_language>
</Country>
</Countries>
Step-by-Step: Writing Java code to praise XML file using DOM Parser
Step 1: Create a Java Class say MyXmlDomParserExample .java with main method
As in this tutorial we will be using just one class with main() to demonstrate dom parsing, lets create the initial skeleton of the class,
package com.code2care.tutorials;
public class MyXmlDomParserExample {
public static void main(String argv[]) {
}
}
Step 2: Create a File object to read our XML file
String xmlFilePathname = "countries.xml";
File xmlFile = new File(xmlFilePathname);
Now let's create a File object using the constructor java.io.File.File(String pathname) in the main method, depending upon where the file is located you need to provide the absolute path of the file (Windows/macOS), for simplicity I have placed the file under my Java Project,
⛏️ You need to import: import java.io.File;
Step 3: Get an instance of DocumentBuilderFactory from javax.xml.parsers using the static method newInstance(),
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilderFactory: This class defines a factory API that enables applications to obtain a parser that produces DOM object trees from XML documents. It was added to Java version 1.4.
⛏️ You need to import: import javax.xml.parsers.DocumentBuilderFactory;
Step 4: Create a DocumentBuilder object using the documentBuilderFactory.newDocumentBuilder() method,
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Now we create a new instance of a javax.xml.parsers.DocumentBuilderusing the currently configured parameters. Note newDocumentBuilder() method throws ParserConfigurationException, so either handle this by surrounding this code under try/catch block or let our main method throws this checked exception.
⛏️ You need to do the below imports:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
Step 5: Create org.w3c.dom.Document object using documentBuilder.parse(File filename);
Document document = documentBuilder.parse(xmlFile);
Document is an interface that renders the entire HTML or XML document. You can say it holds the root of the document tree and provides primary access to the data within the XML/HTML document.
This Document interface also includes the factory methods that are needed to create the objects of XML elements, text nodes, comments, etc.
The parse() parses the content of the XML document and returns a new DOM Document object, it throws exceptions like SAXException, IOException, and IllegalArgument.
Step 6: Create org.w3c.dom.NodeList object for the node we need to fetch data
NodeList nodeList = document.getElementsByTagName("Country");
The NodeList is an Interface that provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live. The items in the NodeList are accessible via an integral index, starting from 0.
⛏️ You need to do the imports: newDocumentBuilder
Step 7: Iterating and parsing XML Node Elements
for (int i = 0; i <= nodeList.getLength() - 1; i++) {
Node node = nodeList.item(i);
Element element = (Element) node;
System.out.println("---- Element: " + (i + 1) + " ----");
System.out.println("Country Name: " + getElementText(element, "name"));
System.out.println("Alfa Code: " + getElementText(element, "alpha_code"));
System.out.println("Population: " + getElementText(element, "population"));
System.out.println("Primary Language: " + getElementText(element, "primary_language"));
}
public static String getElementText(Element element, String tagName) {
return element.getElementsByTagName(tagName).item(0).getTextContent();
}
⛏️ Imports:
import org.w3c.dom.Element;
import org.w3c.dom.Node;
package com.code2care.tutorials;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*
* This is an tutorial to demonstrate
* Parsing XML file using Java
* XML DOM Parser.
*
* @author Code2care Date: 11/07/2020
*
*/
public class MyXmlDomParserExample {
public static void main(String argv[])
throws ParserConfigurationException, SAXException, IOException {
String xmlFilePathname = "countries.xml";
File xmlFile = new File(xmlFilePathname);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(xmlFile);
NodeList nodeList = document.getElementsByTagName("Country");
for (int i = 0; i <= nodeList.getLength() - 1; i++) {
Node node = nodeList.item(i);
Element element = (Element) node;
System.out.println("---- Element: " + (i + 1) + " ----");
System.out.println("Country Name: " + getElementText(element, "name"));
System.out.println("Alfa Code: " + getElementText(element, "alpha_code"));
System.out.println("Population: " + getElementText(element, "population"));
System.out.println("Primary Language: " + getElementText(element, "primary_language"));
}
}
public static String getElementText(Element element, String tagName) {
return element.getElementsByTagName(tagName).item(0).getTextContent();
}
}
Output:
---- Element: 1 ----
Country Name: United States
Alfa Code: USA
Population: 328,239,523
Primary Language: English
---- Element: 2 ----
Country Name: Australia
Alfa Code: AUS
Population: 25,019,600
Primary Language: English
---- Element: 3 ----
Country Name: New Zealand
Alfa Code: NZL
Population: 4,893,830
Primary Language: English
---- Element: 4 ----
Country Name: United Kingdom
Alfa Code: GBR
Population: 66,040,229
Primary Language: English
---- Element: 5 ----
Country Name: Ireland
Alfa Code: IRL
Population: 4,900,000
Primary Language: English
---- Element: 6 ----
Country Name: Canada
Alfa Code: CAN
Population: 35,985,751
Primary Language: English
Troubleshooting Errors while Parsing XML using DOM Parser
1) java.io.FileNotFoundException
If the XML file is not accessible, then you will get java.io.FileNotFoundException exception. Make sure the file is present in the location provided and the file name is correct.
Exception in thread "main" java.io.FileNotFoundException: C:\eclipse-workspace\counties.xml
(The system cannot find the file specified)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
at java.base/sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:86)
at java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:184)
at java.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:652)
at java.xml/impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:150)
at java.xml/internal.parsers.XML11Configuration.parse(XML11Configuration.java:860)
at java.xml/internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
at java.xml/jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:206)
at com.code2care.tutorials.MyXmlDomParserExample.main(MyXmlDomParserExample.java:35)
2) java.lang.NullPointerException
There could be many reasons you may get a NullPointerException (operating on a null object!) but if the document.getElementsByTagName(null); gets a null object you get the below,
Exception in thread "main" java.lang.NullPointerException
at java.xml/com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.nextMatchingElementAfter(DeepNodeListImpl.java:197)
at java.xml/com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.item(DeepNodeListImpl.java:146)
at java.xml/com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl.getLength(DeepNodeListImpl.java:116)
at com.code2care.tutorials.MyXmlDomParserExample.main(MyXmlDomParserExample.java:39)
---- Element: 1 ----
Exception in thread "main" java.lang.NullPointerException
at com.code2care.tutorials.MyXmlDomParserExample.getElementText(MyXmlDomParserExample.java:54)
at com.code2care.tutorials.MyXmlDomParserExample.main(MyXmlDomParserExample.java:45)
3) org.xml.sax.SAXParseException
If the XML document is not well-formed you get the SAXParseException,
[Fatal Error] countries.xml:14:7:
The element type "primary_language" must be terminated
by the matching end-tag "</primary_language>".
Exception in thread "main" org.xml.sax.SAXParseException;
systemId: file:/C:/eclipse-workspace/countries.xml;
lineNumber: 14; columnNumber: 7;
The element type "primary_language" must be terminated by
the matching end-tag "</primary_language>".
at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:261)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:206)
at com.code2care.tutorials.MyXmlDomParserExample.main(MyXmlDomParserExample.java:35)
Reference documents:
- How to Get List of All Country Codes in Java Using Locale Class
- Unsupported major.minor version 52.0 in java
- Java - How to set custom thread name?
- Get the current timestamp in Java
- Java Spring Boot 3 Web Hello World with Gradle in IntelliJ
- [fix] NullPointerException Cannot Invoke findById because Repository is null - Java Spring
- java: unclosed string literal [Error]
- Convert Java Byte Array to String with code examples
- Error: Can not find the tag library descriptor for
- Java 8 - Convert List to Map Examples
- Java - Calculate time taken for the code to execute in milliseconds or nanoseconds
- Fix java.net.ProtocolException: Invalid HTTP method
- Java: Convert Stream to List
- Java equals method - Tutorial
- List of Java JDBC Database Driver Jars, Classes and URLs Details
- Read YAML file Java Jackson Library
- How to display Java Date Time timezone GMT/UTC offset using SimpleDateFormat
- List of Java Keywords
- Enable JSON Pretty Print in Java Jackson
- How to Word-Warp Console logs in IntelliJ
- Convert Map to List in Java 8 using Stream API
- Create a Directory using Java Code
- Ways to Convert Integer or int to Long in Java
- [Program] How to read three different values using Scanner in Java
- Java JDBC Example with Oracle Database Driver Connection
- How to force quit or kill Notepad++ Process - NotepadPlusPlus
- How to install pip on macOS using terminal command [Python] - Python
- Submit html form on dropdown menu value selection or change using javascript - JavaScript
- FileZilla Connection time out Failed to retrieve directory listing - FTP
- SDK Manager: failed to install : Android Studio on Windows - Android-Studio
- Exception in thread main java.lang.NoClassDefFoundError: package javaClass - Java
- What does has notifications silenced in Messages App mean in iPhone - iOS
- Remove Now Playing icon from macOS Big Sur Menu Bar - MacOS