如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件
#0. 准备要转换的xml文件,在Project视界中,右击这个xml文件,在弹出的菜单上选择“Generate XSD schema from XML File...”, 按默认设置生成xsd文件。
将xsd 文件移至#1配置段的configuration/sources/source指定的路径下.
#1. 打开pom.xml, 加入下面的配置段.其中configuration节点中的内容依具体的项目不同而有不同的设定。一般而言,有3处设定:packageName,outputDirectory 和sources,
具体的官方说明文档,请参见:http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/xjc-mojo.html
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.3.1</version>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- The package of your generated sources, Jaxb会按这个Package的层次生成目录,并把Java类生成到这个Package中 -->
<packageName>JaxbHelper.Entity</packageName> <!-- The path of your generated sources class, 输出Java类的根目录地址 -->
<outputDirectory>D:\Git\zfq308\JaxbHelper\src\main\java\</outputDirectory>
<sources>
<!-- 此处为 xsd的路径, Sources节点下可以支持设定多个xsd文件 -->
<source>D:\Git\zfq308\JaxbHelper\src\main\resources\FeedTestCase1.xsd</source>
</sources>
</configuration>
</plugin> </plugins>
</build>
#2. 在POM文件中加入#1所示的xml节点后,在Maven Projects视界窗口,找到你项目的节点,在Plugins节点下,
找到jaxb2节点,展开后,双击执行jaxb2:xjc 任务即可在指定的输出文件夹下生成相应的Entity.
#3. 将xml的数据通过jaxb载入成具体的类对象实例时,可采用下面的代码:本例中,TestSuitesType是xml的根节点。
import JaxbHelper.Entity.TestSuitesType; import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File; public class App {
public static void main(String[] args) throws JAXBException {
File file=new File("D:\\Git\\zfq308\\JaxbHelper\\src\\main\\resources\\FeedTestCase1.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(TestSuitesType.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
TestSuitesType testSuites = (TestSuitesType) jaxbUnmarshaller.unmarshal(file); Integer i=0; // 此行用于断点测试 }
}
请注意:直接执行时,编译器编译通过,但运行时报:Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"TestSuites"). Expected elements are (none)的错误。
究其原因是因为Jaxb并不知道你所生成的这些Java类,谁是主节点。为此,需要在对应xml根节点的类里加入一个标注:@XmlRootElement(name="TestSuites")
加入前为:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TestSuitesType", propOrder = {"testSuite"})
public class TestSuitesType { }
加入后为:
@XmlRootElement(name="TestSuites")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TestSuitesType", propOrder = {"testSuite"})
public class TestSuitesType { }
修改后即可正常使用。
#4. 如XML 有修改需要重新生成xsd、Java类等,可直接删除相应的xsd、java类和META-INF文件夹,必要时再删除target 目录,再重复#2-#3即可。
补充:
在测试的时候发现上述测试代码:
TestSuitesType testSuites = (TestSuitesType) jaxbUnmarshaller.unmarshal(file);
在执行的时候报错:“javax.xml.bind.JAXBElement cannot be cast to 。。。”, 不能直接转换,通过查阅官网资料和https://stackoverflow.com/questions/707084/class-cast-exception-when-trying-to-unmarshall-xml ,改成如下代码:
String xmlPath = App.class.getClassLoader().getResource("Testcases/Book/Config/TestCase_Update.xml").getPath();
File file = new File(xmlPath);
try { InputStream in = new FileInputStream(file);
Source source = new StreamSource(in);
JAXBContext jaxbContext = JAXBContext.newInstance(TestSuiteType.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
JAXBElement<TestSuiteType> root = jaxbUnmarshaller.unmarshal(source, TestSuiteType.class);
TestSuiteType testSuite = root.getValue();
Integer i=0; // 此行用于断点测试
} catch (Exception e) { e.printStackTrace(); }
按这种方式执行的代码,似乎不需要为Entity Java Class 加入@XmlRootElement(name="TheNodeName") 节点。操作上也更为便捷。
如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件的更多相关文章
- 面试官问我:如何在 Python 中解析和修改 XML
摘要:我们经常需要解析用不同语言编写的数据.Python提供了许多库来解析或拆分用其他语言编写的数据.在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML. 本文分享 ...
- 如何在FineReport中解析数据库内XML文件
在数据库表中,其中字段XML所存的为xml格式数据在表xmltest中.那么在使用该表进行报表制作时,需要将存于xml字段中的值读取出来作为报表数据源. XML每条记录数据格式如下: <Fiel ...
- linux中,通过crontab -e编辑生成的定时任务,写在哪个文件中
环境描述: 操作系统:Red Hat Enterprise Linux Server release 6.6 (Santiago) 内核版本:2.6.32-504.el6.x86_64 需求描述: 一 ...
- Springboot中使用Xstream进行XML与Bean 相互转换
在现今的项目开发中,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用,正常的老式方法是通过获取节点来进行一系列操作,个人感觉太过于复杂.繁琐.推荐一套简单的 ...
- 如何在pyqt中实现带动画的动态QMenu
弹出菜单的视觉效果 QLineEdit 原生的菜单弹出效果十分生硬,而且样式很丑.所以照着Groove中单行输入框弹出菜单的样式和动画效果写了一个可以实现动态变化Item的弹出菜单,根据剪贴板的内容是 ...
- properties文件属性值通过xml文件为 java entity属性赋值
一.通过xml配置文件进行赋值: 举个栗子,一目了然: 1.1 properties文件: 1.2 xml配置文件,将properties属性与java entity属性相关联:(这是一个新建的xml ...
- DataBinding注意事项Error parsing XML: duplicate attribute以及如何在listview中使用DataBinding
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 6.1 如何在spring中自定义xml标签
dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...
- 如何在web.xml文件中引入其他的xml文件(拆分web.xml)
转载自:http://www.blogjava.net/jiangjf/archive/2009/04/09/264685.html 最近在做一个Servlet+javaBean的项目,服务器用的是t ...
随机推荐
- verilog中一些基本的门电路如pmos和nmos等
最近在分析波形的时候,发现某个PAD模型的行为与想象的不一致,就进入stdcell里面看了下,主要是pmos和nmos相关的东西,暂列如下: 开关级基元14种 是实际的MOS关的抽象表示,分电阻型(前 ...
- 单文件夹下的C程序如何编写Makefile文件
通过学习已经学会了GCC的一些基础的命令,以及如何将C语言源代码编译成可执行文件. 我们已经知道在linux环境下编译源码时,常会有以下三个步骤: ./configure make make clea ...
- 1028: [JSOI2007]麻将
1028: [JSOI2007]麻将 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2638 Solved: 1168[Submit][Status] ...
- SpringCloud-路由网关(Zuul)
在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.只能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring Cloud ...
- Codeforces Round #412 div2 ABCD
A 按rank给出每个人的赛前分数和赛后分数 如果一个人打败了比他分数高的人 他的分数必然升高 问比赛rated吗 如果一个人的分数改变了肯定rate 如果全都没改的话 也可能是rated 这时候ch ...
- python之Django admin总结
一.Django内置admin a.配置路由 urlpatterns = [ url(r'^admin/', admin.site.urls), ] b.定制admin 在admin.py中 ...
- Python staticmethod
1 @staticmethod 静态方法 when this method is called, we don't pass an instance of the class to it (as we ...
- XE8_DataSnap设置
1.参考文章 http://blog.csdn.net/l799623787/article/details/17002979 ZC: 系列在这里:http://www.cnblogs.com/Chi ...
- VS10_慢_优化
参考网址: http://blog.csdn.net/cll131421/article/details/15341367 1. 我暂时只做了这个: “ 一.VS2010选项视觉体验设置 工具-> ...
- ActiveMQ 消息存储
本章重点 ActiveMQ 中,队列和主题里的消息是怎么存储的 ActiveMQ 提供的四种消息存储形式 ActiveMQ 是怎么为消费者缓存消息的 使用订阅恢复模式,怎么控制消息缓存 简介 JMS ...