Расположение JAXB в файле для неупорядоченных объектов - PullRequest
6 голосов
/ 16 августа 2011

У меня есть некоторые объекты, которые JAXB извлекает из XML-файла. Возможно ли, чтобы JAXB сообщил мне или каким-то образом выяснил, откуда в файле XML (строка и столбец) происходит каждый объект?

Эта информация доступна в какой-то момент, потому что JAXB дает ее мне во время ошибок проверки схемы. Но я бы хотел, чтобы он был доступен и для проверенных объектов.

Ответы [ 2 ]

11 голосов
/ 16 августа 2011

Вы можете сделать это в JAXB, используя XMLStreamReader и Unmarshaller.Listener:

Демо

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>

Выход

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

Клиент

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;
    }

}

Адрес

package forum383861;

public class Address {

}

Для получения дополнительной информации

2 голосов
/ 16 августа 2011

Боюсь, что нет.JAXB построен поверх синтаксического анализатора XML, в этом случае будет создано логическое представление вашего XML-документа, забыв исходное строковое представление вашего документа.

Шаг проверки выполняется, пока ваша строка еще читается,Таким образом, ваш парсер может выдать вам сообщение об ошибке, сообщающее вам позицию ошибки.JAXB будет только игнорировать это сообщение об ошибке.Но как только XML будет проверен и проанализирован, будет существовать только логическое представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...