JAXB location in file for unmarshalled objects

I have some objects that are not sorted from a JAXB XML file. Is it possible that JAXB will tell me or somehow find out where in the XML file (row and column) each object comes from?

This information is available at some point because JAXB provides it during schema validation errors. But I would like it to be available for verified objects.

+5
source share
2 answers

You can do this in JAXB using XMLStreamReaderand Unmarshaller.Listener:

Demo

package forum383861;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Unmarshaller.Listener;
import javax.xml.stream.Location;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);


        XMLInputFactory xif = XMLInputFactory.newFactory();
        FileInputStream xml = new FileInputStream("src/forum383861/input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(xml);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        LocationListener ll = new LocationListener(xsr);
        unmarshaller.setListener(ll);

        Customer customer = (Customer) unmarshaller.unmarshal(xsr);
        System.out.println(ll.getLocation(customer));
        System.out.println(ll.getLocation(customer.getAddress()));
    }

    private static class LocationListener extends Listener {

        private XMLStreamReader xsr;
        private Map<Object, Location> locations;

        public LocationListener(XMLStreamReader xsr) {
            this.xsr = xsr;
            this.locations = new HashMap<Object, Location>();
        }

        @Override
        public void beforeUnmarshal(Object target, Object parent) {
            locations.put(target, xsr.getLocation());
        }

        public Location getLocation(Object o) {
            return locations.get(o);
        }

    }

}

Input.xml

<?xml version="1.0" encoding="UTF-8"?>
<customer>
    <address/>
</customer>

Output

[row,col {unknown-source}]: [2,1]
[row,col {unknown-source}]: [3,5]

Customer

package forum383861;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

}

The address

package forum383861;

public class Address {

}

Additional Information

+9
source

, . JAXB XML- , XML, .

, , . JAXB . XML , .

+2

All Articles