1

I found this question on SO. I shows how to get the line numbers of individual xml elements while unmarshalling with JAXB. I extended this example being able to use xinclude. Unfortunately, I'm not able to get the line number of the xinclude.

So, how do I get the line number of the actual xinclude statement? Here is the extended example:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;

import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

public class Demo {
    public static void main(String[] args) throws JAXBException, SAXException,
            ParserConfigurationException, FileNotFoundException {
        JAXBContext jc = JAXBContext.newInstance(Person.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setXIncludeAware(true);
        spf.setNamespaceAware(true);
        spf.setValidating(true);

        File file = new File("src/person.xml");
        XMLReader xr = spf.newSAXParser().getXMLReader();
        xr.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId)
                    throws SAXException, IOException {
                System.out.println(publicId + " -> " + systemId);
                return null;
            }
        });
        SAXSource source = new SAXSource(xr, new InputSource(
                new FileInputStream(file)));
        Person person = (Person) unmarshaller.unmarshal(source);

        System.out.println("Person:  " + person.locator.getLineNumber());
        System.out.println("Address:  "
                + person.address.locator.getLineNumber());
    }
}

The EntityResolver listener tells me that there is an xinclude statement, but I don't know on which line number.

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xi="http://www.w3.org/2001/XInclude">
    <name>Jane Doe</name>
    <xi:include href="./src/address.xml" />
</person>

address.xml

<?xml version="1.0" encoding="UTF-8"?>
<address>1 A Street</address>

I didn't mention the Person and Address class, so this questions stays short and compact :) I also marked every Locator field with @XmlTransient. Thank you!

Community
  • 1
  • 1
kon
  • 3,732
  • 3
  • 26
  • 34

0 Answers0