您需要在@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>
了解更多信息