2013-06-25 2 views
1

У меня есть класс JAXB сJAXB/Moxy: @XmlLocation Локатор не работает

@XmlTransient 
@XmlLocation Locator location; 
public Locator getLocation() { return location; } 

Но после того, как демаршаллизации (из XML), значение равно нулю. Использование MOXy 2.5.0, JDK 1.7.21.

Что может быть неправильным?

+1

С какого типа ввода вы отшлифовываете? –

+1

На самом деле, опять же, ты получил меня :) Я думаю, что это происходит через «Узел». Проверка –

+0

Правильно, так что есть метод, который загружает XML в DOM, а затем выбирает 'Element' с помощью XPath, и пусть MOXy на них. Есть ли способ туннелировать информацию «Locator» через DOM? И если вы создадите ответ, я соглашусь с –

ответ

1

@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