Java Reference Library →

XMLStreamException – XML Parsing with StAX

XMLStreamException – XML Parsing with StAX

Understand XMLStreamException in Java, when and why it occurs, and how to handle it effectively using StAX parsers with beginner-friendly examples.

This reference explains XMLStreamException – XML Parsing with StAX through its syntax, examples and boundaries. Use the linked course lessons when the surrounding Java concepts are unfamiliar.

  1. Use this reference

    Identify the documented behavior, read a complete example and check its inputs before applying it.

Introduction to XMLStreamException

When working with XML in Java, one of the most efficient and scalable ways to parse large documents is through the StAX API (Streaming API for XML). However, if the XML stream is malformed or an I/O issue occurs, you might run into XMLStreamException.

This tutorial is your complete beginner-friendly guide to understanding XMLStreamException. We’ll walk through what it is, when it happens, and how to handle it effectively with realistic Java examples. You’ll also learn how to structure your code to avoid and recover from parsing issues in production-grade systems.

What is XMLStreamException?

XMLStreamException is a checked exception in the javax.xml.stream package. It is thrown during XML parsing using StAX when the stream is malformed, incomplete, or encounters an I/O error.

public class XMLStreamException extends Exception

It typically occurs in pull-based parsers like XMLStreamReader and XMLEventReader when methods like next() or getText() fail to process XML content correctly.

Common Causes of XMLStreamException

  • Malformed XML (e.g., unclosed tags, incorrect nesting)
  • Invalid characters or syntax errors
  • I/O errors while reading the XML source
  • Calling a method in an incorrect parser state

Basic Example: Triggering XMLStreamException

Let’s start by triggering an XMLStreamException using malformed XML content with an XMLStreamReader.

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.StringReader;

public class StAXParserDemo {
    public static void main(String[] args) {
        String brokenXml = "<fruits><item>Apple</item><item>Banana</fruits>"; // Missing closing tag for second <item>

        XMLInputFactory factory = XMLInputFactory.newInstance();
        try {
            XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(brokenXml));

            while (reader.hasNext()) {
                reader.next(); // Triggers exception
            }
        } catch (XMLStreamException e) {
            System.out.println("Caught XMLStreamException!");
            System.out.println("Message: " + e.getMessage());
            System.out.println("Location: Line " + e.getLocation().getLineNumber() +
                    ", Column " + e.getLocation().getColumnNumber());
        }
    }
}

Expected Output:

Caught XMLStreamException!
Message: The element type "item" must be terminated by the matching end-tag "</item>".
Location: Line 1, Column 48

Here, the second <item> tag is missing its closing tag, which results in an XMLStreamException.

How to Handle XMLStreamException Gracefully

1. Always use try-catch

try {
    XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(xml));
    while (reader.hasNext()) {
        reader.next();
    }
} catch (XMLStreamException e) {
    System.err.println("XML parsing error: " + e.getMessage());
}

2. Validate XML Before Parsing

If you control the XML input, validate it with tools like XMLLint or an XSD schema before parsing.

3. Log Line and Column

XMLStreamException provides a Location object to pinpoint the issue. Log this information for faster debugging.

Good Practice: Catching and Recovering from Partial XML Errors

In some applications, it may be acceptable to skip bad entries and continue parsing.

while (reader.hasNext()) {
    try {
        int eventType = reader.next();
        if (eventType == XMLStreamReader.START_ELEMENT) {
            System.out.println("Start: " + reader.getLocalName());
        }
    } catch (XMLStreamException e) {
        System.err.println("Skipping invalid XML segment: " + e.getMessage());
        break; // or continue if acceptable
    }
}

Complete Example: Valid XML Parsing with StAX

Let’s see what valid parsing looks like:

public class StAXValidParser {
    public static void main(String[] args) {
        String validXml = "<fruits><item>Apple</item><item>Banana</item></fruits>";
        XMLInputFactory factory = XMLInputFactory.newInstance();

        try {
            XMLStreamReader reader = factory.createXMLStreamReader(new StringReader(validXml));
            while (reader.hasNext()) {
                int event = reader.next();
                if (event == XMLStreamReader.START_ELEMENT &&
                    "item".equals(reader.getLocalName())) {
                    reader.next(); // move to text content
                    System.out.println("Fruit: " + reader.getText());
                }
            }
        } catch (XMLStreamException e) {
            System.err.println("Parsing failed: " + e.getMessage());
        }
    }
}

Output:

Fruit: Apple
Fruit: Banana

Best Practices

  • Never assume the XML is correct — always wrap parsing in try-catch
  • Log exact line and column info for quick debugging
  • Use XMLInputFactory.setProperty() for security (e.g., disabling external entities)
  • Test your parser with both good and bad XML to harden it against unexpected input

Conclusion

XMLStreamException is your signal that the XML being parsed has a problem — whether it's syntactic, structural, or I/O-related. Understanding how and why this exception is thrown will help you build more resilient applications that consume and produce XML reliably.

Use StAX when you need efficient, low-memory XML parsing, and always wrap your parsing logic in robust try-catch blocks to gracefully handle unexpected issues.

Using this reference

Check the example’s types, inputs and documented behavior before copying it into an application. Some APIs require external libraries, files or platform services; consult their setup notes.

Related explanations: Java Data Types - Primitive and Non-Primitive, Java Class - Blueprint of Objects, Exceptions in Java Introduction.

Supporting documentation: Official Java learning guide.

Reference checks are optional and do not count toward course progress.

    Reference library →