jaxb xsd生成xml_使用JAXB从XSD生成XML

jaxb xsd生成xml

这是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla发表的帖子。 Mohamed解释了如何使用JAXB从给定的XSD生成XML 。

(注意:对原始帖子进行了少量编辑以提高可读性)

我们可以使用JAXB使用给定的Schema将Java对象编组为XML,反之亦然。 可以以DTD , XSD或其他格式指定XML模式。

工具“ xjc”可用于从XSD架构生成带注释的Java类。 可以下载Java Web服务开发人员包(WSDP) ,其中包括所需的JAXB实现工具。 在这里,我将阐明如何动态生成XML。

使用的样本XSD是:

– Expense.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="expenseReport" type="ExpenseT" />
<xs:complexType name="ExpenseT"><xs:sequence><xs:element name="user" type="UserT"/><xs:element name="items" type="ItemListT"/></xs:sequence>
</xs:complexType>
<xs:complexType name="UserT"><xs:sequence><xs:element name="userName" type="xs:string" /></xs:sequence>
</xs:complexType>
<xs:complexType name="ItemListT"><xs:sequence><xs:element name="item" type="ItemT" maxOccurs="unbounded"/></xs:sequence>
</xs:complexType>
<xs:complexType name="ItemT"><xs:sequence><xs:element name="itemName" type="xs:string" /><xs:element name="purchasedOn" type="xs:string" /><xs:element name="amount" type="xs:decimal" /></xs:sequence>
</xs:complexType>
</xs:schema>

现在,我们使用xjc工具生成相应的Java类。 对生成的Java类进行适当的注释。 我不会详细介绍类的注释,因为这会使事情变得复杂。

xjc.exe费用.xsd

默认情况下,该命令在名为“ generated”的目录中生成Java类。 xjc可以使用很多选项,并且可以看看使用

xjc-帮助

下面的Main类使用生成的类来创建XML。

– Main.java

package generated;import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.math.BigDecimal;public class Main{public static void main(String[] args) throws JAXBException{ObjectFactory factory = new ObjectFactory();UserT user = factory.createUserT();user.setUserName("Sanaulla");ItemT item = factory.createItemT();item.setItemName("Seagate External HDD");item.setPurchasedOn("August 24, 2010");item.setAmount(new BigDecimal("6776.5"));ItemListT itemList = factory.createItemListT();itemList.getItem().add(item);ExpenseT expense = factory.createExpenseT();expense.setUser(user);expense.setItems(itemList);JAXBContext context = JAXBContext.newInstance("generated");JAXBElement<ExpenseT> element = factory.createExpenseReport(expense);Marshaller marshaller = context.createMarshaller();marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE);marshaller.marshal(element,System.out);}}

在上面的XSD中,我们看到很少声明复杂类型。 这些复杂的类型会生成Java类。 子元素和属性成为该类的属性,并且为它们提供了getter和setter。 不能直接创建此类的实例,即不能对其进行调用。 每当我们编译XSD时,都会生成一个ObjectFactory类-这是用于创建XSD Complex类型的实例的工厂(上述Java类的Lines-17,19,24,27)。

一旦获得实例,便使用该类提供的设置器将相应的数据填充到属性中。 还要注意,复杂元素可以具有许多复杂元素作为类的成员。 在那种情况下,我们使用工厂获取复杂元素的实例,然后使用外部复杂元素的setter。

例如:在上面的XSD中,ExpenseT是一个复杂类型,它由UserT和ItemT列表(ItemListT)组成。 在上面的Java类(第27、28、29行)中,我们正在创建ExpenseT的实例,然后使用设置器设置UserT和ItemListT的值。 通过为工厂调用createExpenseReport()创建RootElement。 方法的名称受根元素名称的影响,并且方法的返回类型和参数类型与根元素的类型相同。

一旦我们为XML中的不同元素(属性)设置了值,现在就可以实际生成XML。 我们必须有一个Marshaller (从Java对象获取XML)或一个Unmarshaller (从XML对象获取Java)。

我们需要一个Marshaller –可以从JAXBContext实例获得。 第31,32行获取Marshaller的实例。 可以为marshaller设置不同的属性,在上面的代码中,我们将jaxb.formatted.output设置为true,这意味着所获得的XML格式正确,使用户可读。

支持的不同属性是:

  • jaxb.encoding
  • jaxb.formatted.output
  • jaxb.schema位置
  • jaxb.noNamespaceSchemaLocation
  • jaxb.fragment

<instance_of_marshaller> .marshal()是用于生成XML的方法。 它被重载以接受以下输出机制:

  • org.xml.sax.ContentHandler
  • org.w3c.dom.Node
  • javax.xml.transform.Result
  • java.io.Writer
  • java.io.OutputStream
  • javax.xml.stream.XMLStreamWriter
  • javax.xml.stream.XMLEventWriter

生成的XML如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><expenseReport><user><userName>Sanaulla</userName></user><items><item><itemName>Seagate External HDD</itemName><purchasedOn>August 24, 2010</purchasedOn><amount>6776.5</amount></item></items>
</expenseReport>

相关文章:

  • 带有简单框架教程的Android XML绑定
  • 使用XML Pull增强Android XML解析
  • 具有Spring和Maven教程的JAX–WS
  • Spring 3 RESTful Web服务

翻译自: https://www.javacodegeeks.com/2011/02/jaxb-generate-xml-xsd.html

jaxb xsd生成xml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 10g客户端连接11g,生产环境oracle10g升级至11g准备工作

主要有以下的步骤 &#xff1a;1.new ORACLE_HOME(11g), old ORACLE_HOME (10g)--这些需要提前提供给客户&#xff0c;作为基本的约定2.install oracle software 11.2.0.2.0 on production--总共有7个DB,时间很紧&#xff0c;所以准备要充分3.apply DB patch additional if nee…

JBoss BPM Travel Agency的微服务迁移故事

不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍了在实际使…

windows快捷操作

命令行启动或关闭VMWare服务&#xff1a; net start VMwareHostdVMAuthdServiceVMUSBArbService"VMware NAT Service"VMnetDHCP#启动VMware虚拟机服务net start VMwareHostdnet start "VMware NAT Service"net start VMnetDHCPcmd#停止VMvare虚拟机服务net…

oracle 打印值,oracle – 在SQL Developer中打印变量的值

我想打印一个特定变量的值在一个匿名块内。我使用Oracle SQL Developer。我尝试使用dbms_output.put_line。但它不工作。我使用的代码如下所示。SET SERVEROUTPUT ONDECLARECTABLE USER_OBJECTS.OBJECT_NAME%TYPE;CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;V_ALL_COLS VARCHAR2(5…

【leetcode】Combinations (middle)

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n 4 and k 2, a solution is: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 思路&#xff1a;有点像0-1背包问题&#xff0c; 对于从1-n的每一个数字都可以选择放入…

oracle 批量读,Oracle批量读取数据和批量绑定

通常我们获取游标数据是用fetch some_cursor into var1, var2 的形式&#xff0c;自 Oracle 8i 起&#xff0c;Oracle 为我们提供了fetch bulkcollect 来批量取游标中的数据&#xff0c;它能在读取游标中大量数据的时候提升效率&#xff0c;采用bulkcollect可以将查询结果一次性…

java压缩_Java压缩

java压缩在最近的项目中&#xff0c;我们不得不做一些我个人从未真正看过的事情。 压缩。 我们需要拍摄几个文件和图像&#xff0c;将它们压缩并提供给FTP使用&#xff0c;是的&#xff0c;总有一天&#xff0c;感觉确实回到了90年代。 除了过去的FTP之行外&#xff0c;它还是一…

我们的世界

看完记得留言说说你的感想 http://lchml.com/our-world/ 转载于:https://www.cnblogs.com/licheng127/p/4239021.html

eslint php,ESlint操作步骤详解

这次给大家带来ESlint操作步骤详解&#xff0c;ESlint操作的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。vue-cli脚手架创建的项目默认使用ESlint规则&#xff0c;启动项目的时候因为各种语法报错&#xff0c;不得不先停下了解一下什么是ESlint&…

FileSystemMap:与文件系统交互的自然方法

作为项目的一部分&#xff0c;我目前正在研究创建FileSystemMap 。 我已经开始了一个非常小的GitHub的项目在这里举办的代码。 本质上&#xff0c;此映射实现将允许用户与其文件系统上的目录进行交互&#xff0c;就好像它是java.util.Map 。 映射中的每个条目将是该目录中的文…

动画原理——绘制正弦函数环绕运动椭圆运动

书籍名称&#xff1a;HTML5-Animation-with-JavaScript 书籍源码&#xff1a;https://github.com/lamberta/html5-animation 1.正弦函数。x位置递增&#xff0c;y位置用sin生成。 这段代码是不需要ball.js的。 代码如下&#xff1a; <!doctype html> <html><hea…

oracle优质图书,经典Oracle图书推荐(之四)_oracle

经典的oracle图书:Oracle High Performance Tuning for 9i and 10g by Gavin PowellBook DescriptionThere are three parts to tuning an Oracle database: data modeling, SQL code tuning and physical database configuration.A data model contains tables and relationsh…

expr命令 linux,Shell expr命令进行整数计算的实现

expr 是 evaluate expressions 的缩写&#xff0c;译为“表达式求值”。Shell expr 是一个功能强大&#xff0c;并且比较复杂的命令&#xff0c;它除了可以实现整数计算&#xff0c;还可以结合一些选项对字符串进行处理&#xff0c;例如计算字符串长度、字符串比较、字符串匹配…

单身数字_完美单身

单身数字我不时遇到一些Java程序员&#xff0c;他们不确定他们应该如何正确实现Singleton模式。 &#xff08;如果您不知道什么是Singleton&#xff0c;请尝试Wikipedia&#xff1a; Singleton模式 &#xff09;。 我并不是在谈论在线程环境中的正确实现。 但是&#xff0c;使用…

linux下bios设置内存电压,系统安装的BIOS设置?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼要安装系统前&#xff0c; 要为旧系统做好备份工作&#xff0c;为新系统准备了所需的软件之后&#xff0c;接下来的工作就是安装Windows XP了。而安装系统要知道系统安装的BIOS设置&#xff0c; 如果您的硬盘采用了动态分区&#x…

DATEADD(Day, DATEDIFF(Day,0,ShippingTime), 0)

select DATEADD(Day, DATEDIFF(Day,0,GETDATE()), 0),DATEDIFF(Day,0,GETDATE()),GETDATE() 结果&#xff1a; (无列名) (无列名) (无列名)2015-01-30 00:00:00.000 42032 2015-01-30 20:04:57.050 转载于:https://www.cnblogs.com/Unrmk-LingXing/p/4263098.html

linux内存剩余量为什么这么少,为什么我的Linux系统中空闲内存如此之少?

"How come there is only so few free memory on my Linux PC?"Come to same question? No matter how much you put RAM in your motherboard, you quickly notice the free RAM is reduced so fast. Free RAM miscalculation? No!Before answering this, first …

java heroku_Heroku运行Java

java heroku如果您是像我这样的Java迷&#xff0c;那么您有个好消息值得振奋。 Heroku现在运行Java&#xff01; 嗯&#xff0c;与其他流行的“ Web”语言&#xff08;如PHP / RoR&#xff09;不同&#xff0c;Java具有在Web服务器中进行部署和维护的麻烦。 一直以来&#xff0…

Java集合框架练习-计算表达式的值

最近在看《算法》这本书&#xff0c;正好看到一个计算表达式的问题&#xff0c;于是就打算写一下&#xff0c;也正好熟悉一下Java集合框架的使用&#xff0c;大致测试了一下&#xff0c;没啥问题。 import java.util.*; /** * 用来计算表达式* for example: 12*3*(43*1)-3*123/…

关于Ecllipse

一、熟悉Eclipse 1.Eclipse是由IBM公司投资4000万美元开发的集成开发工具。它基于Java语言编写&#xff0c;并且是开放源代码的、可扩展的&#xff0c;也是目前最流行的Java集成开发工具之一。另外&#xff0c;IBM公司捐出Eclipse源代码&#xff0c;组建了Eclipse联盟&#xff…