2012-03-29 5 views
1

Ich schreibe ein Skript, um eine KML-Datei mit JAXB und MOXy zu analysieren, aber ich habe Schwierigkeiten, @XmlPath mit einem bereitgestellten Namespace zu arbeiten.MOXy @XmlPath mit Namespace arbeiten

Wenn meine KML sieht wie folgt aus: -

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

... und meine Bohne sieht wie folgt aus: -

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

... dann, kml.getName() kehrt Test, die wie es funktioniert sollte.

Wenn jedoch meine KML einen Namespace wie folgt enthält: -

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

... und meine Bohne sieht wie folgt aus: -

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

... dann, kml.getName() kehrt null.

habe ich jaxb.properties am rechten Paketebene und ich bin mit der Abhängigkeit der folgenden moxy: -

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

Was ich hier genau bin fehlt? Vielen Dank.

Antwort

1

Im Folgenden finden Sie ein Beispiel zum Konfigurieren der Namespace-Informationen.

Paket-info

Sie können die @XmlSchema Anmerkung verwenden, um die Namespace-Informationen und Qualifikation angeben. Im folgenden Beispiel geben wir den Namespace an, und standardmäßig sollten alle Elemente Namespace-qualifiziert sein.

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

import javax.xml.bind.annotation.*; 

Kml

Wir brauchen keine Namespace-Informationen in der Kml Klasse angeben. Diese Informationen stammen aus den Einstellungen in 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; 
    } 
} 

Demo

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/Output

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

Weitere Informationen