@XmlLocation
действительно работает, но если вы отмените сборку с DOM Node
, он не будет записывать информацию о местоположении. Ниже я приведу пример.
JAVA МОДЕЛЬ
Ниже модель Java, который мы будем использовать для этого примера.
Foo
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
Bar bar;
}
Бар
Мы будем использовать @XmlLocation
аннотацию на Bar
класса для хранения место. MOXy поддерживает аннотацию @XmlLocation
из эталонной реализации JAXB (включая переупаковку во внутреннем пакете), а также собственную версию.
// import com.sun.xml.bind.annotation.XmlLocation;
// import com.sun.xml.internal.bind.annotation.XmlLocation;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlLocation;
import org.xml.sax.Locator;
@XmlAccessorType(XmlAccessType.FIELD)
public class Bar {
@XmlTransient
@XmlLocation
Locator location;
}
XML ВХОД (Input.xml)
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar/>
</foo>
DEMO КОД
Ниже некоторые демо-код, который будет распаковать различные типы входных данных и затем выводит местоположение.
import java.io.File;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.stream.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
import org.xml.sax.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File file = new File("src/forum17288002/input.xml");
Foo foo1 = (Foo) unmarshaller.unmarshal(file);
outputLocation(file, foo1);
InputSource inputSource = new InputSource("src/forum17288002/input.xml");
Foo foo2 = (Foo) unmarshaller.unmarshal(inputSource);
outputLocation(inputSource, foo2);
Source source = new StreamSource("src/forum17288002/input.xml");
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xmlStreamReader = xif.createXMLStreamReader(source);
Foo foo3 = (Foo) unmarshaller.unmarshal(xmlStreamReader);
outputLocation(xmlStreamReader, foo3);;
XMLEventReader xmlEventReader = xif.createXMLEventReader(source);
Foo foo4 = (Foo) unmarshaller.unmarshal(xmlEventReader);
outputLocation(xmlEventReader, foo4);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse("src/forum17288002/input.xml");
Foo foo5 = (Foo) unmarshaller.unmarshal(document);
outputLocation(document, foo5);
}
private static void outputLocation(Object input, Foo foo) {
Locator locator = foo.bar.location;
System.out.print(locator.getLineNumber());
System.out.print(" ");
System.out.print(locator.getColumnNumber());
System.out.print(" ");
System.out.println(input.getClass());
}
}
ВЫВОД
Ниже показан результат запуска демо-кода. Единственный вход, который не привел к местоположению, - это вход DOM. Это имеет смысл, поскольку узлы DOM не содержат никакой информации о местоположении, доступной MOXy.
3 11 class java.io.File
3 11 class org.xml.sax.InputSource
3 11 class com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl
3 11 class com.sun.xml.internal.stream.XMLEventReaderImpl
0 0 class com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl
С какого типа ввода вы отшлифовываете? –
На самом деле, опять же, ты получил меня :) Я думаю, что это происходит через «Узел». Проверка –
Правильно, так что есть метод, который загружает XML в DOM, а затем выбирает 'Element' с помощью XPath, и пусть MOXy на них. Есть ли способ туннелировать информацию «Locator» через DOM? И если вы создадите ответ, я соглашусь с –