首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >让MOXy @XmlPath与命名空间协同工作

让MOXy @XmlPath与命名空间协同工作
EN

Stack Overflow用户
提问于 2012-03-30 02:46:44
回答 1查看 1.5K关注 0票数 1

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

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

代码语言:javascript
运行
复制
<kml>
    <Document>
        <name>Test</name>
    </Document>
</kml>

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

代码语言:javascript
运行
复制
@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包含如下名称空间:-

代码语言:javascript
运行
复制
<kml xmlns="http://www.opengis.net/kml/2.2">
    <Document>
        <name>Test</name>
    </Document>
</kml>

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

代码语言:javascript
运行
复制
@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的依赖项:

代码语言:javascript
运行
复制
<dependency>
   <groupId>org.eclipse.persistence</groupId>
   <artifactId>org.eclipse.persistence.moxy</artifactId>
   <version>2.3.2</version>
</dependency>

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-30 03:30:39

下面是一个示例,演示如何配置命名空间信息。

包-info

您可以使用@XmlSchema注释来指定命名空间信息和限定。在下面的示例中,我们将指定命名空间,默认情况下,所有元素都应该是命名空间限定的。

代码语言:javascript
运行
复制
@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中的设置

代码语言:javascript
运行
复制
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;
    }
}

演示

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
   <Document>
      <name>Test</name>
   </Document>
</kml>

有关详细信息的,请访问

  • http://blog.bdoughan.com/2010/09/xpath-based-mapping-geocode-example.html
  • http://blog.bdoughan.com/2010/08/jaxb-namespaces.html
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9931520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档