1

我创建了一个使用编组生成如下 xml 的Company类:

<?xml version="1.0" encoding="UTF-8"?>
<ns2:company  xmlns:ns2="http://www.example.com/">
   <ns2:employee>
      <job>sogi</job>
      <name>togi</name>
      <age>22</age>
   </ns2:employee>
</ns2:company>

注意:我在Company类中使​​用了 @XmlPath("employee/job/text()") 标记来获取所需的路径。

但是当我使用相同的公司类解组时,我没有得到正确的对象值。相反,我得到了空值。

4

1 回答 1

1

您需要在@XmlPath注释中包含命名空间信息。

包信息

由于您的 XML 文档具有命名空间限定,您将需要利用包级别@XmlSchema注释来指定命名空间信息。

@XmlSchema(
    namespace="http://www.example.com/",
    xmlns={
        @XmlNs(namespaceURI = "http://www.example.com/", prefix = "foo")
    }
)
package forum14848450;

import javax.xml.bind.annotation.*;

公司

@XmlPath命名空间限定的 XmlPath 片段的映射中,您需要利用您在@XmlSchema注释上定义的前缀。

package forum14848450;

import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
public class Company {

    @XmlPath("foo:employee/job/text()")
    private String employeeJob;

    @XmlPath("foo:employee/name/text()")
    private String employeeName;

    @XmlPath("foo:employee/age/text()")
    private int employeeAge;

}

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供程序,您需要包含一个jaxb.properties在与域模型相同的包中调用的文件,其中包含以下条目(请参阅: http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as -your.html )。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

下面的演示代码将从您的问题中解组文档,然后将其编组回 XML。

package forum14848450;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14848450/input.xml");
        Company company = (Company) unmarshaller.unmarshal(xml);

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

}

输出

下面是运行演示代码的输出。请注意输出文档如何使用@XmlPath注释中定义的前缀。

<?xml version="1.0" encoding="UTF-8"?>
<foo:company xmlns:foo="http://www.example.com/">
   <foo:employee>
      <job>sogi</job>
      <name>togi</name>
      <age>22</age>
   </foo:employee>
</foo:company>

了解更多信息

于 2013-02-13T10:13:24.550 回答