【问题标题】:Getting MOXy @XmlPath to Work with Namespace让 MOXy @XmlPath 使用命名空间
【发布时间】:2012-03-29 18:46:43
【问题描述】:

我正在编写一个脚本来使用 JAXB 和 MOXy 解析 KML 文件,但我很难让 @XmlPath 使用提供的命名空间。

如果我的 KML 看起来像这样:-

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

...我的 bean 看起来像这样:-

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

...我的 bean 看起来像这样:-

@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,并且我正在使用以下 MOXy 的依赖项:-

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

我到底错过了什么?谢谢。

【问题讨论】:

    标签: java xml jaxb eclipselink moxy


    【解决方案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 类中指定任何命名空间信息。此信息来自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/Output

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

    更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 2012-08-09
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2021-08-23
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多