Как заставить MOXy @XmlPath работать с пространством имен - PullRequest
1 голос
/ 29 марта 2012

Я пишу скрипт для анализа KML-файла с использованием JAXB и MOXy, но у меня возникают трудности при работе @XmlPath для работы с предоставленным пространством имен.

Если мой KML выглядит следующим образом: -

<kml>
    <Document>
        <name>Test</name>
    </Document>
</kml>

... и мой бин выглядит так: -

@XmlRootElement(name = "kml")
public class Kml {
    @XmlPath("Document/name/text()")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

... тогда kml.getName() возвращает Test, что работает как должно.

Однако, если мой KML содержит пространство имен, подобное этому: -

<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <name>Test</name>
    </Document>
</kml>

... и мой компонент выглядит так: -

@XmlRootElement(name = "kml", namespace = "http://www.opengis.net/kml/2.2")
public class Kml {
    @XmlPath("Document/name/text()")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

... then, kml.getName() возвращает null.

У меня действительно jaxb.properties на правильном уровне пакета, и я использую следующую зависимость MOXy: -

<dependency>
   <groupId>org.eclipse.persistence</groupId>
   <artifactId>org.eclipse.persistence.moxy</artifactId>
   <version>2.3.2</version>
</dependency>

Чего именно мне здесь не хватает?Спасибо.

1 Ответ

1 голос
/ 29 марта 2012

Ниже приведен пример, демонстрирующий настройку информации о пространстве имен.

пакет-информация

Вы можете использовать аннотацию @XmlSchema для указания информации о пространстве имен и квалификации. В приведенном ниже примере мы определим пространство имен, и по умолчанию все элементы должны быть квалифицированы для пространства имен.

@XmlSchema(
    namespace="http://www.opengis.net/kml/2.2", 
    elementFormDefault=XmlNsForm.QUALIFIED)
@XmlAccessorType(XmlAccessType.FIELD)
package forum9931520;

import javax.xml.bind.annotation.*;

Kml

Нам не нужно указывать какую-либо информацию о пространстве имен в классе Kml. Эта информация поступает из настроек в package-info:

package forum9931520;

import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name = "kml")
public class Kml {
    @XmlPath("Document/name/text()")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Демо

package forum9931520;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        File xml = new File("src/forum9931520/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Kml kml = (Kml) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(kml, System.out);
    }

}

Input.xml / выход

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
   <Document>
      <name>Test</name>
   </Document>
</kml>

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

...