欢迎您: 游客   等级: 游客 | 注册 | 登陆 |
发 贴
请选择需要发布主题的板块
用户名 密码
欢迎新会员: fotso  
查看
12404
回复
2
云儿
级别新手上路
精华
积分1
财富0 jstruggle币
发帖数0
注册2009-8-21
状态 我暂时不在线
发表于2007-1-25 12:59 楼主
使用JAXB处理XML文档??先睹为快
使用JAXB处理XML文档??先睹为快 关键词:Java,XML,JAXB,DTD,绑定模式(Binding Schema),验证(validate),marshal,unmarshal JAXB以其方便的XML数据处理能力可能会引起你的兴趣。你可能还不了解JAXB是什么,想要知道它到底有什么好处,如果这是你需要的,你才会再花时间去细细的研究它,或者你只需要使用最基本的功能。然而Sun关于JAXB的文档有80页之多。我想大部分人都没有耐心看完这样的长篇大论。本文以简短的篇幅介绍了JAXB的基本使用,算是先睹为快吧。本文附带的代码包括了JAXB1.0 early access版本和本文所使用的代码。欢迎与我讨论: mailto:boyofjava@sina.com 本文假设你会使用Java编程,了解并能够看懂XML,DTD。 1 为什么要使用JAXB 在Java中处理XML数据的常规方法有SAX,DOM等。其中SAX使用起来很麻烦,不能修改XML数据;而DOM的处理大文档速度非常的慢,易用性也不必SAX好到哪里去。实际上,无论是SAX还是DOM都不是专门为Java准备的,它们都是访问XML文档的统一底层接口,与语言无关。 现在我们有了另外的选择。这就是JAXB和JDOM。JDOM与本文无关,目前最新的版本是beta8,感兴趣的话,可以访问[url]http://www.jdom.org/[/url]。 JAXB的全名是Java ™ Architecture for XML Binding,目前是1.0的early access版本,在Sun的Java站点只有注册为成员才能够下载。JAXB的特点就是将你用DTD定义好的XML文档映射为Java对象,提供简单、快速的数据操作方式。要访问XML中的元素、属性只要通过相应对象上的一系列getter和 setter方法。你还可以通过marshal方法将对象的数据写进XML文件,通过unmarshal方法将XML文件的数据读入对象,通过validate方法验证XML文件是否符合DTD的约束。JAXB的缺点就在于只能访问特定的(也就是你用DTD定义的)XML文档。 2 JAXB如何工作 JAXB包括了一个运行类库和一个模式编译器。首先你要定义XML的DTD,然后编写一个绑定模式(Binding Schema)。DTD定义了XML文档,绑定模式也是一个XML文件,指出DTD定义的XML文档如何被映射为Java对象。运行编译器,将DTD和绑定模式作为参数传给编译器,编译器就会生成Java代码。编译生成的Java代码,通过这些代码就可以访问XML文档了。 3 JAXB的安装 以1.0 early access为例,它不包含在JDK中,先到[url]http://java.sun.com/xml[/url]下载。注意由于是早期版本,需要先登录才能下载,本文附带的源码包含了JAXB1.0 early access。下载后将文件解压缩,在lib目录中有两个文件。jaxb-rt-1.0-ea.jar是运行支持库,jaxb-xjc-1.0-ea.jar是模式编译器。注意bin目录中的xjc文件只能在UNIX下使用,如果你的系统是Windows,那么你需要在命令行窗口手工输入命令来编译。为了在任何地方都可以运行模式编译器和它生成的代码,我们要把这两的文件加入CLASSPATH。一个简单的办法是把这两个文件拷贝到jre/lib/ext下。 4 一个简单的例子 有这样一个XML文档。它描述书的列表,举例如下: 文件exampleA.xml Java编程入门 张三 2002-6-6 35.0 XML在Java中的应用 李四 2002-9-16 92.0 其DTD文件如下: 文件bookList.dtd 现在我们就来编写一个最简单的绑定模式,其文件扩展名应该为xjs。 文件bookList.xjs 现在就可以运行模式编译器生成Java代码,请先保证CLASSPATH中包含了JAXB的两个JAR文件。Windows用户注意bin目录下的那个文件是没用的。在命令行运行: java com.sun.tools.xjc.Main bookList.dtd bookList.xjs 如果没出问题,编译器就生成了Book.java,BookList.java两个文件。你不用去理解这两个源文件里面的代码,只要知道怎么使用它们提供的方法就可以了。它们的继承结构都是这样的: java.lang.Object javax.xml.bind.ValidatableObject javax.xml.bind.MarshallableObject javax.xml.bind.MarshallableRootElement BookList or Book BookList.java主要包含了以下方法 BookList() //构造函数 List getBook() //得到书的集合,List中的对象实际类型是Book,可以添加、修改、删除其中的元素 void deleteBook() //删除集合 void emptyBook() //删除并生成一个新的空集合 void marshal(X) //将数据写进XML文档 void unmarshal(X) //将数据从XML文档读入对象 void validate(X) //检查是否符合DTD约束,同时检查子树。在这个例子中就是BookList的Book集合 void validateThis() //检查是否符合DTD约束,不检查子树 其中marshal,unmarshal,validate被重载,有多种参数形式(可以参考JAXB的API文档)。 Book.java主要包含了以下方法 Book() String getName() String getAuthor() String getPublishDate() String getPrice() void setName(String x) void setAuthor(String x) void setPublishDate(String x) void setPrice(String x) void marshal() void unmarshal() void validate() 现在我们就可以使用这两个文件访问XML了。首先编译这两个文件。编写一个Test.java文件,把它和生成的两个文件以及前面的exampleA.xml放在一起。这个程序从 exampleA.xml读入数据,作修改(把第一本书作者改成王五)后写入exampleB.xml。因为中文的编码问题,所以我们需要多一点手续。 文件Test.java import java.io.*; import java.util.*; import javax.xml.bind.*; import javax.xml.marshal.*; public class Test{ public static void main(String[] args) throws Exception{ BookList bl = new BookList(); FileInputStream fis = new FileInputStream("exampleA.xml"); try{ bl = bl.unmarshal(fis); }finally{ fis.close(); } List books = bl.getBook(); Book b = (Book)books.get(0); b.setAuthor("王五"); bl.validate(); //先验证,不然marshal会出错 FileOutputStream fos = new FileOutputStream("exampleB.xml"); XMLWriter xw = new XMLWriter(fos,"GBK"); try{ bl.marshal(xw); }finally{ fos.close(); } } } 编译运行,生成的文件exampleB.xml如下: Java编程入门 王五 2002-6-6 35.0 XML在Java中的应用 李四 2002-9-16 92.0 5 更进一步:数据类型转换 你可能已经注意到在上面的例子中,生成的Book对象的getPrice方法返回的是String,实际上它应该是float。同样publishDate以该是日期类型,而不是字符串。这是因为我们的绑定模式写得太简单了,模式编译器生成了默认的String类型。现在我们这样写: 文件bookList2.xjs 用java com.sun.tools.xjc.Main bookList.dtd bookList2.xjs运行编译器。生成的Book文件的相应代码为: float getPrice() java.util.Date getPublishDate() bookList2.xjs第3行将Price转换成了float类型,float类型是一个简单类型,因此用convert="float"描述就可以了。而 publishDate需要转变成java.util.Date,这是一个类,而且他没有以字符串作为参数的构造函数。parse="TransDate.parseDate"就表示使用unmarshal读取数据的时候,会调用TransDate.parseDate()方法。这个静态方法以字符串为参数,返回java.util.date。print="TransDate.printDate"的作用相反。TransDate这个类需要我们提供。 文件TransDate.java import java.util.Date; public class TransDate { private static java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd"); public static Date parseDate(String d) { try { return df.parse(d); } catch (java.text.ParseException pe) { System.out.print(pe); return new Date(); } } public static String printDate(Date d) { return df.format(d); } } 6 那些使JAXB能够做到,但本文没有提到的 本文提供的这个例子很简单,实际上JAXB还可以定义文档的哪些元素(属性)可以被转换成类,哪些被转换成类的属性。处理元素的属性。处理枚举值。为一些元素共同的子元素生成接口(因为JAXB不支持NameSpace),定义继承结构等等。 7 JAXB不能做到的 Sun的文档里提到的: 仅支持用DTD定义XML 不支持NameSpace 不支持内部子集、NOTATIONs、ENTITY、ENTITIES等。 另外,我发现如果要写一条处理指令到XML文档中,例如指定转换的样式单 在JAXB中好像做不到,在javax.xml.marshal.XMLWriter中有一个chars(String str)方法,可以把字符串到XML文件的声明后面,但是这个方法对特殊字符作了转义,也就是没办法可以做到。这很奇怪,因为这是一个常用的功能,要实现也不难。也许还有我没有发现的办法。倒是有一个doctype方法可以写DOCTYPE声明。 8 参考文档 1 The Java ™ Architecture for XML Binding User’s Guide ([url]http://java.sun.com/xml/jaxb/jaxb-docs.pdf[/url]) 2 Web Services Made Easier. The Java TM APIs and Architectures for XML, A Technical White Paper ([url]http://java.sun.com/xml/webservices.pdf[/url] )
分享  
20171205caihuali
级别新手上路
精华0
积分1
财富0 jstruggle币
发帖数1
注册2017-12-5
状态 我暂时不在线
发表于2018-6-28 11:10    1
yanmaneee
级别新手上路
精华0
积分1
财富0 jstruggle币
发帖数2
注册2019-3-28
状态 我暂时不在线
发表于2019-3-28 17:58    2

gucci belts

michael kors outlet

goyard handbags

kd 11 shoes

fila

jordan 12

kd shoes

air max 95

golden goose

kevin durant shoes

balenciaga triple s

coach outlet

adidas nmd

nike air max 95

air max 97

off white hoodie

chrome hearts

hermes belts for men

adidas nmd

kd 10

nike react

yeezy boost 350 v2

nike epic react

ferragamo belts

adidas yeezy boost

yeezy shoes

asics shoes

offwhite

yeezy boost 350 v2

stephen curry shoes

fila shoes

yeezy boost 500

hermes handbags for sale

basketball shoes

fila disruptor

lebron shoes

ralph lauren uk

michael kors handbags

russell westbrook shoes

kobe shoes

michael kors factory outlet

coach factory outlet

yeezy boost 350

cheap jordans

fila sneakers

longchamp handbags

nmd

coach outlet sale

jordans

michael kors

chrome hearts

goyard

jordan 13

nike air max 2018

nhl jerseys

fake rolex watches

yeezys

moncler jacket

kyrie 5

baseball jerseys

adidas superstars

michael kors purses

hermes belt

air max 270

paul george shoes

fila

off white shoes

hermes handbags bag

yeezys

yeezy boost 350 v2

Kanye West shoes

jordan sneakers

off white x jordan 1

kobe byrant shoes

kobe sneakers

nike flyknit racer

off white

lacoste outlet

reebok outlet

adidas superstar

michael kors handbags

cheap nfl jerseys

hermes birkin

retro jordans

longchamp

nike hyperdunk

hermes belt

nike air max 270

kd 11

cheap mlb jerseys

nike air max 2017

yeezy boost

curry 6

supreme outlet

gucci belt

adidas yeezy

coach outlet

yeezy boost 350 v2

birkin bag

westbrook shoes

birkin bag

yeezy boost

timberland boots

chrome hearts online

nike air max 95

off white hoodie

michael kors factory outlet online

air max 2019

coach factory outlet

lebron james shoes

cheap jordans

air jordan

balenciaga shoes

fila shoes

yeezy boost 350

nike air max 97

michael jordan shoes

yeezy boost 350 v2

nike air vapormax

lacoste online shop

coach outlet sale

yeezy shoes

nike air max 270

hogan outlet online

yeezy boost 350

goyard bags

cheap nba jerseys

air yeezy

yeezy boost

fila

james harden shoes

curry 5

off white clothing

ferragamo belts

golden goose outlet

adidas zx flux

golden goose sneakers

lebron 16

adidas ultra boost

michael kors outlet online

lebron 11

michael kors bags

michael kors outlet

michael kors outlet

lebron shoes

timberland boots

jordan shoes

nike air max 97

air max 95

kobe 9

reebok shoes

westbrook shoes

mbt shoes online

supreme clothing

adidas yeezy

nike vapormax

michael kors handbags outlet

michael kors outlet

russell westbrook shoes

coach outlet

nba jerseys

hermes belt

curry 4 shoes

nmd

michael kors handbags

supreme clothing

hogan outlet

jordan 4

calvin klein outlet

balenciaga

jordan retro 6

kyrie 4

supreme new york

nike epic react

jordan retro

curry 6 shoes

nike air force

nike max

kate spade handbags

air jordan 4

nike air max 90

timberlands

adidas nmd

nmd

hermes handbags

kobe basketball shoes

kobe 11

fila

michael kors handbags

nike air max 97

lebron 15

jordan shoes

adidas tubular

michael kors handbags

michael kors outlet online

jordan shoes

golden goose outlet

cheap jordans

asics running shoes

kyrie 5 shoes

goyard handbags

nike air max 2019

yeezy

off white

chrome hearts online

adidas yeezy

100% real jordans for cheap

nike air max 97

kyrie shoes

nfl store

nike huarache

yeezy shoes

yeezy boost

nike air max 270

golden goose

kd 11

nike lebron 16

air max 95

yeezy boost 350 v2

air max 97

golden goose

lebron 16 shoes

nike air max

golden goose outlet

curry 4

yeezy

supreme hoodie

adidas stan smith

nike shox

golden goose

goyard bags

golden goose outlet

timberland

curry 4

michael kors outlet

rolex replica

nike vapormax

jimmy choo shoes

vapormax

michael kors outlet online

nike air vapormax

curry 5 shoes

adidas tubular

supreme

supreme clothing

curry 5

balenciaga shoes

vapormax

kyrie 5

canada goose

kd shoes

yeezy boost 350

golden goose

yeezy boost

vans shoes

yeezy boost 350

cheap jordans

coach outlet online

converse outlet store

adidas gazelle

kyrie 3

ferragamo belt

mlb jerseys

off white

coach handbags

jordan 11

hermes online shop

kyrie 4 shoes

adidas tubular shadow

michael kors uk

mbt shoes outlet

chrome hearts

air max 90

red bottom shoes

nike sneakers

air force 1

nike air max

golden goose sneakers

jordan 11 retro

birkin bag

nike kd 11

nike air max 270

nike sneakers for men

timberland outlet

hermes bags

nike basketball shoes

curry 6 shoes

michael kors outlet

fake rolex

michael kors outlet

yeezy shoes

chrome hearts outlet

hermes handbags

supreme hoodie

nike air max

curry 6

lacoste polo

golden goose sneakers

kobe 9

yeezy 500

nike jordans

jordans

ralph lauren uk

lebron 16

air max 97

golden goose outlet

mbt shoes

hermes outlet online

fitflops sale clearance

louboutin shoes uk

vapormax

caterpillar boots

off white jordan 1

kyrie 5 shoes

michael kors outlet

michael kors handbags

off white clothing

longchamp outlet

supreme t shirt

cheap jordans

jordan shoes

balenciaga shoes

balenciaga

michael kors bags

yeezy shoes

air jordan 13

nike cortez men

yeezy 500

jordan retro 12

fake rolex

air max 270

air max 97

yeezy boost 350

ultra boost

red bottoms

lacoste polo shirts

curry 6

nike air max

lebron 16 shoes

kobe 11

jordan shoes

air jordan

supreme clothing

yeezy boost 350

balenciaga

moncler outlet

lacoste

nike foamposite

replica rolex

nike air max 95

kobe shoes

bape hoodie

off white shoes

fitflops

michael kors outlet online

christian louboutin

nike sneakers for women

air max 2018

nike vapormax

air max 270

supreme clothing

yeezy shoes

adidas nmd r1

golden goose

adidas ultra

michael kors

birkin bag

moncler jackets

canada goose jacket

louboutin shoes

yeezy boost 700

jordan shoes

curry shoes

off white clothing

supreme hoodie

curry 4

ysl handbags

vapormax

nike shoes

converse outlet

balenciaga sneakers

air max 270

calvin klein outlet online

nfl jerseys

ferragamo belt

cheap nba jerseys

nike air huarache

longchamp handbags

lebron 16

vans outlet

harden shoes

ysl

valentino

michael kors outlet

valentino shoes

air max

nike flyknit

nike cortez

air jordans

michael kors outlet

nike air force 1

yeezy boost

off white nike

yeezy boost

yeezy 700

yeezy boost 350

fila shoes

michael kors handbags

cat boots

michael kors

red bottom heels

kd shoes

adidas stan smith shoes

bape hoodie

jordans

yeezy boost 350

longchamp bags

fila shoes

coach outlet

kyrie irving shoes

zx flux

lebron 10

lebron 15 shoes

retro jordans

polo ralph lauren

coach outlet online

golden goose sneakers

longchamp bags

lacoste polo

nike shox for men

adidas tubular

jordans

nike vapormax

jordan 6

yeezy

air jordan

nike huarache

nike react

yeezy shoes

curry 6 shoes

moncler jackets

yanmaneee
JStruggle BBS

Powered by Jstruggle! 1.8 © 2006-2009

Processed in 0.062s JStruggle BBS Surprise!

粤ICP备05106211号 - 皖ICP备06010590号

copyright©JStruggle工作室版权所有 - 联系我们