假设我有一个名为 Test 的类,如下所示
public class Test {
private String testId;
private String description;
private String department;
public Test() {}
public Test(String id,String des,String dpt) {
this.testId = id;
this.department = dpt;
this.description = des;
}
public String getTestId() {
return testId;
}
public void setTestId(String testId) {
this.testId = testId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
也是一个 XML 字符串,其中包含 Test 类对象的数据。 XML 字符串是
<test>
<testId>1</testId>
<description>This is first test</description>
<department>surgeon</department>
</test>
现在我的任务是解析该 XML 字符串并创建一个 Test 类的对象,并将该 XML 中包含的所有数据放入该对象中。我正在使用 JDOM 进行 XML 解析。我想知道是否有任何解决方案可以将所有 XML 格式的数据直接复制到 Test 对象中?
现在我是这样做的:我解析 XML 字符串并逐个获取每个节点的数据,然后调用 setter 方法为 Test 类对象的每个字段设置数据。 p>
最佳答案
简答:是的,有这样的解决方案。
它叫做 "XML data binding" ,或者“O/X Mapping”(对象/XML 映射),或者“OXM”。
将 XML 文档转换为对象称为解码。
将对象转换(序列化)为 XML 文档称为编码。
注意:
术语编码 和解码 不仅与对象/XML 相关,反之亦然。在这里阅读:Marshalling (Computer Science) .
Java 自己的解决方案叫做Java Architecture for XML Binding (JAXB) .这是JSR 222描述的规范. JDK 包含一个 JAXB implementation ,因此您(通常)不需要从 JAXB Project home page 下载独立的引用实现 (RI) .
注意:
您可以使用 xjc (binding compiler) 检查 JDK 的 JAXB 版本。 , 与 JDK 捆绑在一起:xjc -version
有用的链接
- Java Architecture for XML Binding - 官方 Oracle Java 学习路径
- A JAXB Tutorial - 官方教程 来自 JAXB project (引用 实现)
- JAXB hello world example - 非常 简单易用的教程
- JAXB tutorial – Getting Started - 另一个带有示例的简短教程
只需在谷歌上搜索“JAXB 教程”,就有很多。
重要提示:
JAXB 是一种规范,它有不同的实现(包括引用实现)。但是这些传统实现不能使用XPath ,这很可悲,因为对于大量嵌套的 XML 文件,使用 XPath 会更有效。
EclipseLink MOXy提供具有许多扩展的 JAXB 实现。其中之一是 XPath based mapping .在执行我的一个项目时,我发现它非常有用,其中涉及 OXM。
以下是一些相关链接:
- XPath Based Mapping - 来自 Blaise Doughan 的非常有用的文章, 团队负责人 对于 EclipseLink JAXB (MOXy) 项目。另请查看其他文章 他的博客。
- Make your JAXB cleaner with the MOXy implementation - 另一篇带有很好示例的有用文章,概述了 EclipseLink MOXy 的优势。
关于java - 将 XML 映射到 Java 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16753945/