- 浏览: 94741 次
- 性别:
- 来自: 厦门
文章分类
最新评论
-
石头茨:
你好,除了jocky能够比较好的混淆编译器之外,还有没有其他的 ...
java各种代码混淆方法的优缺点 -
java_ZJian:
谢谢
slf4j配置实例 -
f839903061:
楼主有具体步骤吗?
java代码混淆--jocky -
huiqiCHEN1989:
学习,谢谢分享。
java程序员白盒单元测试必备技能 -- Junit4 -
MagicPocket:
哥也是 ios 开发,最近在接触 android ,共勉。。。 ...
开始学习android努力~~
以下内容是个人对jaxb技术的总结及操作实例讲解:
1、什么是jaxb?
也就是说jaxb是一项数据绑定技术,它将xml文件映射成一个个的java类,程序员通过操作这些类就可以对xml文件中的元素进行读取等操作,同样程序员也可以改变这些类的属性,最后映射到xml文件中,这样做可以把程序员的主要精力放在业务逻辑上,并且也更符合面向对象的思想,而无需像使用DOM4J等技术一样需要处理一个个的xml节点,但是jaxb技术还不够成熟,对于映射的数据类型的控制,以及对语义等价的实现的还不够完美。
2、使用xjc工具生成xml对应的java类
如果xml结构比较简单,建议手动的编写java类即可,如下示例
command.xml文件为:
<?xml version="1.0" encoding="UTF-8"?> <Command-Mappers> <Comand-Mapper> <CommandReg>shutdown</CommandReg> <ClassName>com.yinhoo.ca.command.ShutDownCmdExecutor</ClassName> </Comand-Mapper> </Command-Mappers>
对应的CommandMapper.java为:
* @(#)CommandMapper.java 2011-2-12 package com.yinhoo.ca.dto; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * Mapped for command.xml * * @author chenming * @date 2011-2-12 * @version $Revision$ */ @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "Command-Mappers") public class CommandMapper { private List<ComandMapper> cmdMapperList; /** * @return the cmdMapperList */ public List<ComandMapper> getCmdMapperList() { return cmdMapperList; } /** * @param cmdMapperList * the cmdMapperList to set */ public void setCmdMapperList(List<ComandMapper> cmdMapperList) { this.cmdMapperList = cmdMapperList; } @XmlElement(name = "Comand-Mapper") @XmlType(name = "Comand-Mapper") @XmlAccessorType(XmlAccessType.FIELD) public static class ComandMapper { @XmlElement(name = "CommandReg") private String commandReg; @XmlElement(name = "ClassName") private String className; /** * @return the commandReg */ public String getCommandReg() { return commandReg; } /** * @param commandReg * the commandReg to set */ public void setCommandReg(String commandReg) { this.commandReg = commandReg; } /** * @return the className */ public String getClassName() { return className; } /** * @param className * the className to set */ public void setClassName(String className) { this.className = className; } } }
稍微复杂的例子encrypt_list.xml为:
<?xml version="1.0" encoding="UTF-8"?> <EncryptInfo> <DoEncrypt>true</DoEncrypt> <CaServer>10.10.10.40</CaServer> <CaPort>50000</CaPort> <EncryptList> <Encrypt> <type>FILE</type> <value>conf\configs.xml</value> </Encrypt> <Encrypt> <type>FOLD</type> <value>conf\domains\</value> <!-- 排除的文件列表,以 逗号分隔. --> <exclude>.svn,gmail.com.xml,china.com.xml</exclude> </Encrypt> </EncryptList> </EncryptInfo>
对应的EncryptMapper.java为:
* @(#)EncryptMapper.java 2011-2-14 package com.yinhoo.ca.dto; import java.io.Serializable; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; /** * 对应encrypt_list.xml * * @author chenming * @date 2011-2-14 * @version $Revision$ */ @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "EncryptInfo") public class EncryptMapper { @XmlElement(name = "DoEncrypt") private Boolean doEncrypt; @XmlElement(name = "CaServer") private String caServer; @XmlElement(name = "CaPort") private Integer caPort; @XmlElementWrapper(name = "EncryptList") private List<Encrypt> encryptList; /** * @return the doEncrypt */ public Boolean getDoEncrypt() { return doEncrypt; } /** * @param doEncrypt * the doEncrypt to set */ public void setDoEncrypt(Boolean doEncrypt) { this.doEncrypt = doEncrypt; } /** * @return the caServer */ public String getCaServer() { return caServer; } /** * @param caServer * the caServer to set */ public void setCaServer(String caServer) { this.caServer = caServer; } /** * @return the caPort */ public Integer getCaPort() { return caPort; } /** * @param caPort * the caPort to set */ public void setCaPort(Integer caPort) { this.caPort = caPort; } /** * @return the encryptList */ public List<Encrypt> getEncryptList() { return encryptList; } /** * @param encryptList * the encryptList to set */ public void setEncryptList(List<Encrypt> encryptList) { this.encryptList = encryptList; } @XmlElement(name = "Encrypt") @XmlType(name = "Encrypt") @XmlAccessorType(XmlAccessType.FIELD) public static class Encrypt { @XmlElement(name = "type") private String type; @XmlElement(name = "value") private String value; @XmlElement(name = "exculde") private String exclude; /** * @return the type */ public String getType() { return type; } /** * @param type * the type to set */ public void setType(String type) { this.type = type; } /** * @return the value */ public String getValue() { return value; } /** * @param value * the value to set */ public void setValue(String value) { this.value = value; } /** * @return the exclude */ public String getExclude() { return exclude; } /** * @param exclude * the exclude to set */ public void setExclude(String exclude) { this.exclude = exclude; } } }
否则需生成xml对应的xsd文件,然后利用xsd文件生成xml对应的java类。关于如何利用xml生成对应的xsd文件可参考以下链接(待完善):
http://sunxboy.iteye.com/blog/411513/
本文采用的xml文件为guitars.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <guitars> <guitar id="10021"> <builder luthier="true">Ryan</builder> <model>Mission Grand Concert</model> <back-sides>Brazilian Rosewood</back-sides> <top>Adirondack Spruce</top> <notes> <![CDATA[ Just unbelievable... this guitar has all the tone & resonance you could ever want. I mean, <<WOW!!!>> This is a lifetime guitar. ]]> </notes> </guitar> <guitar id="0923"> <builder smallShop="true">Bourgeois</builder> <model>OMC</model> <back-sides>Bubinga</back-sides> <top>Adirondack Spruce</top> </guitar> <guitar id="11091"> <builder>MartinCompany</builder> <model>OM-28VR</model> <back-sides>Indian Rosewood</back-sides> <top bearclaw="true">Sitka Spruce</top> <notes>It's certainly true that Martin isn't the only game in town anymore. Still, the OM-28VR is one of their best models... and this one has some fabulous bearclaw to boot. Nice specimen of a still-important guitar manufacturer. </notes> </guitar> </guitars>
对应的guitars.xsd为:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="back-sides" type="xs:string"/> <xs:element name="builder"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="luthier" default="false"> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="smallShop" default="false"> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="guitar"> <xs:complexType> <xs:sequence> <xs:element ref="builder"/> <xs:element ref="model"/> <xs:element ref="back-sides"/> <xs:element ref="top"/> <xs:element ref="notes" minOccurs="0"/> </xs:sequence> <xs:attribute name="id" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="guitars"> <xs:complexType> <xs:sequence> <xs:element ref="guitar" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="model" type="xs:string"/> <xs:element name="notes" type="xs:string"/> <xs:element name="top"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="bearclaw" default="false"> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
1、新建一个名为jaxbDemo的项目;
2、将guitar.xsd文件及guitar.xml文件放至到项目的根目录下
3、下载xjc工具所需的JAXB2_20101209.jar包
http://jaxb.java.net/2.2.3/JAXB2_20101209.jar
4、双击jar包后生成一个jaxb-ri-20101209文件夹,然后将环境变量中Path变量设置为这个文件的bin目录的路径,这样xjc命令就可以使用了。
5、在命令模式下进入项目根目录,然后执行:
xjc -p test guitars.xsd -d src
命令这样所需的java类就生成了,以下为命令的详细说明:
xjc [–p java文件所在的包] [-xmlschema] [–d 保存java文件的目录]
-xmlschema xsd文件路径。
-d 指定了保存java文件的目录
-p 指定了生成的java文件所在的包
6、最后就可以写相应的xml2java和java2xml方法,对xml文件进行操作了代码如下Java2XML:
package test; import java.io.FileInputStream; import java.io.FileOutputStream; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import dto.Guitars; /** * 从guitars.xml读取信息,保存到java的类中,然后又写入另一个java文件中 * * @author ming.chen * @date 2011-2-25 * @version $Revision$ */ public class Java2XML { private String inputFilename; private String outputFilename; private JAXBContext jc; private final String PACKAGE_NAME = "dto"; public Java2XML(String inputFilename, String outputFilename) throws Exception { this.inputFilename = inputFilename; this.outputFilename = outputFilename; jc = JAXBContext.newInstance(PACKAGE_NAME); } public Guitars unmarshal() throws Exception { Unmarshaller u = jc.createUnmarshaller(); return (Guitars) u.unmarshal(new FileInputStream(inputFilename)); } public void marshal(Guitars guitars) throws Exception { Marshaller m = jc.createMarshaller(); m.marshal(guitars, new FileOutputStream(outputFilename)); } public static void main(String[] args) { if (args.length < 2) { System.err.println("Incorrect usage: java RoundTripper" + "[input XML filename] [output XML filename]"); return; } try { Java2XML rt = new Java2XML(args[0], args[1]); Guitars guitars = rt.unmarshal(); rt.marshal(guitars); } catch (Exception e) { e.printStackTrace(); return; } } }
XML2Java.java
package test; import java.io.FileInputStream; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import dto.Guitar; import dto.Guitars; /** * 将guitars.xml的内容写入java内存 * * @author ming.chen * @date 2011-2-25 * @version $Revision$ */ public class XML2Java { private String inputFilename; private JAXBContext jc; private final String PACKAGE_NAME = "dto"; public XML2Java(String inputFilename) throws Exception { this.inputFilename = inputFilename; jc = JAXBContext.newInstance(PACKAGE_NAME); } public Guitars unmarshal() throws Exception { Unmarshaller u = jc.createUnmarshaller(); return (Guitars) u.unmarshal(new FileInputStream(inputFilename)); } public static void main(String[] args) { if (args.length < 1) { System.err.println("Incorrect usage: java RoundTripper" + "[input XML filename] [output XML filename]"); return; } try { XML2Java rt = new XML2Java(args[0]); Guitars guitars = rt.unmarshal(); List<Guitar> guitarList = guitars.getGuitar(); for (Guitar guitar : guitarList) { System.out.println(guitar.getBackSides()); System.out.println(guitar.getId()); System.out.println(guitar.getNotes()); } } catch (Exception e) { e.printStackTrace(); return; } } }
相关推荐
**JAXB应用实例** Java Architecture for XML Binding (JAXB) 是Java平台标准版(Java SE)和企业版(Java EE)的一部分,它提供了一种在Java对象和XML文档之间进行映射的机制。JAXB允许开发者在不关心底层XML语法...
**JAXB实例入门** Java Architecture for XML Binding (JAXB) 是Java平台中用于XML和Java对象之间进行绑定的一个标准框架。它允许开发者在Java类和XML文档之间进行无缝转换,大大简化了XML数据的处理。在本文中,...
2. **实例化(Unmarshalling)**:当需要将XML数据转换为Java对象时,JAXB使用Unmarshaller接口解析XML文档,生成对应的Java对象。这个过程是将XML数据"反序列化"为可操作的Java对象。 3. **序列化(Marshalling)*...
标题“jaxb资料及实例,里面还包含了其他资料地址3”暗示了这个压缩包可能包含有关JAXB的详细教程、示例代码以及指向更多学习资源的链接。这可能包括PDF文档、HTML页面、Java源代码或者视频教程等,帮助开发者深入...
本教程将通过一个实际的demo实例来详细讲解如何使用JAXB2来生产Java类。 **1. JAXB2概述** JAXB2是Java SE 6及更高版本的标准组件,它允许开发者在不编写大量手动代码的情况下,将XML文档映射到Java对象,反之亦然...
同时,JAXB(Java Architecture for XML Binding)是Java中处理XML和Java对象之间转换的标准接口。下面将详细介绍这些知识点。 首先,**JAX-WS** 是一种用于构建SOAP(Simple Object Access Protocol)Web服务的...
5. **处理解析后的数据**:现在,你可以访问并操作解析出的Java对象,就像处理任何其他Java对象一样。 ```java System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge());...
JAXB允许开发人员将XML Schema转换为Java类,从而可以以面向对象的方式操作XML数据,极大地简化了XML的处理工作。 **JAXB的核心功能** 1. **XML到Java对象的转换**:JAXB提供了一种机制,可以将XML文档解析成Java...
**JAXB实例** 在"Test"这个例子中,我们可以假设有一个XML文档,描述了某个图书信息,例如: ```xml <title>Java编程思想 布鲁斯·艾克尔 机械工业出版社 ``` 对应地,我们有以下的Java类: ```java @...
- 创建JAXBContext实例,它是整个JAXB绑定的核心。 - 定义Java类来映射XML元素,使用`@XmlRootElement`和`@XmlElement`等注解。 - 使用`Unmarshaller`对象将XML字符串解析为Java对象。 - 使用`Marshaller`对象将Java...
通常,这个示例可能会定义一些带有JAXB注解的Java类,然后创建`JAXBContext`实例,生成`Marshaller`,最后将Java对象序列化为XML文件。 在实际开发中,JAXB广泛应用于各种场景,如Web服务的响应和请求、配置文件的...
- Gradle则可以使用`jaxb`插件或自定义Task来执行相同的操作。 6. **使用示例**: - 创建一个简单的XSD文件,例如: ```xml ``` - 运行`xjc`命令,如`xjc person.xsd`,生成Java类。 - ...
通过JAXBContext实例,我们可以进行 marshalling 和 unmarshalling 操作。 3. Marshalling:通过JAXBContext的marshal方法将Java对象转换为XML。 4. Unmarshalling:通过JAXBContext的unmarshal方法将XML文档解析...
6. **Context**:JAXBContext是整个JAXB操作的核心,它负责管理和维护XML与Java之间的映射关系,并提供Unmarshaller和Marshaller的实例。 在JAXB-RI(Reference Implementation)中,包含了完整的JAXB实现和相关...
接下来,我们需要创建一个`JAXBContext`实例,它是JAXB的核心,负责管理所有相关的类和它们的XML表示。然后,我们可以使用`Marshaller`和`Unmarshaller`对象来序列化(将Java对象转换为XML)和反序列化(从XML恢复...
- 对于大型项目,可能需要考虑性能问题,因为JAXB涉及大量的反射操作。 总之,JAXB为Java开发者提供了一种强大而便捷的方式来处理XML数据,它简化了XML和Java对象之间的转换,提升了开发效率。在实际开发中,理解并...
2. 操作 API:提供了统一的基本操作(如 marshalling,unmarshalling),隐藏了 JAXB 内部操作的实现代码。 JAXB 的基本操作 ------------------- ### 3.1 XML 和 Java 类绑定 JAXB 提供了两种方式将 Java 对象...
- **JAXB与JPA**(Java Persistence API)结合,可以在数据库操作中方便地处理XML数据。 总结,JAXB是Java中处理XML的重要工具,它提供了高效的XML到Java对象的转换能力,简化了XML数据的处理,广泛应用于Web服务、...
在这个示例中,我们将探讨如何使用JAXB来操作XML。 首先,我们需要创建Java类来表示我们的数据模型。在本例中,我们有两个类 `ClassA` 和 `ClassB`。`ClassA` 包含一个 `classAId`、一个 `classAName` 以及一个 `...
然后,JAXB会使用这些类来解析XML并生成相应的对象实例。对于简单的XML,这通常很有效。但是,对于复杂的XML结构,转换为Map可能更为合适。 转换XML到Map的过程通常包括以下步骤: 1. 创建一个XML解析器:使用`...