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:
- Java equals method - Tutorial
- Unbound classpath container: JRE System Library [JavaSE-1.7]
- Spring Boot: @RequestBody not applicable to method
- Java 8: Steam map with Code Examples
- Java Program: Random Number Generator
- Java java.time.Clock class code examples [Java Date Time API]
- Fix: type argument is not within bounds of type-variable T
- [Fix] java.net.MalformedURLException: unknown protocol
- Java 7 addSuppression() and getSuppression() Exception Handling
- Convert Java Array to ArrayList Code Example
- How to Word-Warp Console logs in IntelliJ
- Ways Compare Dates in Java Programming with Examples
- Remove Trailing zeros BigDecimal Java
- CRUD operations in Spring Boot + JDBC
- [Java Threads] Should we extend Thread Class or implement Runnable interface
- Json Serialization and Deserialization using Java Jackson
- Create simple struts2 project using maven commands
- How to install Java OpenJDK 11 on Alpine Linux
- Unsupported major.minor version 52.0 in java
- Error: Can not find the tag library descriptor for
- Java: Convert String to Binary
- How to run Java Unit Test cases with Apache Maven?
- Java: Testing Private Methods in JUnit using reflection API Example
- Java JDBC Connection with MySQL Driver in VS Code + Troubleshooting
- Java Join Strings with Comma Separator
- Copy file from a remote server to current local directory system using SCP command - HowTos
- Java JDBC Connection with MySQL Driver in VS Code + Troubleshooting - Java
- How to extend retiring SharePoint 2010 Workflows and continue with Office 365 - SharePoint
- How to add hint text in bootstrap input text field and text area - Bootstrap
- How to Subscribe to AWS SNS Topic [SMS/Email/Lambda] via CLI - AWS
- How to create a Git Project in Eclipse (Step-by-step) - Eclipse
- Install Oh My Zsh on Ubuntu Docker complete steps - Ubuntu
- Selenium Maven Dependency for pom.xml - Java