2012-03-29 82 views
1

我正在編寫一個腳本來使用JAXB和MOXy解析KML文件,但我很難讓@XmlPath與提供的命名空間一起工作。獲取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; 
    } 
} 

...那麼,kml.getName()回報null

我有jaxb.properties在合適的包裝水平,我使用下面的莫西的依賴: -

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

正是我缺少的是什麼?謝謝。

回答

1

下面是一個演示如何配置名稱空間信息的示例。

包信息

可以使用@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> 

更多信息