说起来真老土,现在才知道XmlBean这个东西,
用过以后,我再也不想用dom或sax类的xml解析器了,bea公司推荐送给apache的这个东西确实不是一般般的强,简直就是超强。
简单说一下xmlbean的用法。
1. 制作一个xsd文件,可以用一个xml文件转换过来,然后自己改一下,也可以自己写,比较方便的xsd文件制作工具是xmlspy,或者装了wst的eclipse也可以,后者是最容易找到的了。
2. 去apache网站下载xmlbean,在xml那个子项里面。
3. 按照例子运行ant就可以了
给一个ant脚本的例子
<target name="xmlbean_bea">
<taskdef name="xmlbean"
classname="com.bea.xbean.tool.XMLBean"
classpathref="lib.xmlbean" target="_blank" rel="external nofollow" />
<xmlbean
failοnerrοr="true"
destfile = "${build.dir}/${xsd.bea.jarfile}"
debug = "true"
optimize = "true">
<classpath refid="lib.xmlbean" />
<fileset dir="${xsd.bea.dir}" includes="**/*.*"/>
</xmlbean>
</target>
生成出来的jar包中,特供了对该xml各个元素的操作,用起来就象一般的javabean一样的简单。对象都特供了工厂之类对xml文件进行解析和生成。
用开weblogic的人都很熟悉这个东西。
补充一下自己的心得:
1. 默认根据xsd生成的java类,package就是namespace定义的名字,如果没有定义xsd的namespace,package就默认为noNamespace。用这些java类生成出来的xml文件也自动带有namespace。
其实这是很烦的事情,因为我们通常希望生成出来的xml文件没有namespace,而我们希望生成出来的java类可以指定package。这时候就可以配置一个xsdConfig文件,指定那个namespace对于的java类package是什么,例如:下面就是指定没有namespace时,生成的文件去 com.mypackage
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
<xb:namespace uri="">
<xb:package>com.mypackage</xb:package>
</xb:namespace>
</xb:config>
2. xsdConfig可以定义出一个namespace和package的对应关系,可如果我有两个无namespace的文件,我打算生成到两个package中,怎么办?
答案:没好办法,把两套xsd/xsdConfig文件放置在两个目录,然后在ant脚本中做两个target,再写一个target调用这两个target好了。如果时再bea的workshop中,需要建立两个schema project。如果有人有更好的办法请告诉我。
3. apache的xmlbean和bea公司的xmlbean有冲突,因为他们都用到了javax.xml.namespace.QName,不幸,他们用的是同名但又不相同的类,而且差异较大。所以如果在一个app中,如果即用了apache的又用了bea的,哪就只有一个能用,就看哪一个QName先被实例化了。
解决办法就是:如果项目中用了weblogic,哪就用bean的xmlbean,反正一样可以用。两者的ant脚本基本一样,就是taskdef不一样而已。
apache的taskdef:
<taskdef name="xmlbean"
classname="org.apache.xmlbeans.impl.tool.XMLBean"
classpathref="lib.xmlbean.apace" target="_blank" rel="external nofollow" />
bean的taskdef
<taskdef name="xmlbean"
classname="com.bea.xbean.tool.XMLBean"
classpathref="lib.xmlbean.bea" target="_blank" rel="external nofollow" />