xmlbean+xmlspy 编辑xml
1、首先使用xmlspy定义xsd(xmlspy)
两种方式:
1)手工定义
创建一个新的xsd文件,然后定义schema的命名空间(在程序中解析xml时必要的),create new document—>xsd w3c xml schema->schema design->schema setting->Target namespace输入你的namesprce(可以输入你公司的网址或者其他)
->ok。命名空间就创建好了。
接下来,开始创建你的元素,属性等等,具体的语法请滤过请参考我的另外一篇blog《xsd的语法》。
2)同xml来生成xsd
用xmlspy打开你定义的xml,->DTD/Schema->Generate DTD/Schema->ok ,过程中不用修改对话框中的任何属性。
(问题:我在生成过程中string类型到xsd中就成了 Enum 类型,郁闷,请高手不吝赐教 )
2、 使用xmlbean通过xsd来生成java类
设置xmlbean的环境变量,方法同设置java的classpath,或者像我这样写这个批处理
=========================bat======================================
1:set path=E:/jdk1.6/bin
2:xmlbeans-2.0.0/bin/scomp -out jars/aws.schema.jar schema/mine.xsd
=========================bat======================================
第一行:设置环境变量
第二行 :当前文件夹下包含xmlbeans-2.0.0,执行bin/scomp命令,根据 mine.xsd 生成jar文件,并放到jars文件夹下
3、使用生成的jar来操作xml
一般情况下,你在xsd中定义了namespace ,生成的类的包名就是namespace的名字,如果没有定义namespace,那么生成的包名为?想不起来了!
开始调用,比如你的xsd的根据元素为Person,那么生成的类为PersonDocument,接着
File f = new File(“xml name”);
PersonDocument doc = PersonDocument.Factory.parse(f);
(此处建议parse时传入file,当然传入xml的文件名称也可以,但是如果出错,异常信息会让你超级郁闷,那是google不到的!)
//然后person的下级元素为name,
doc.getPersonConfig.getName();
……..
(以此类推,省略代码8000行)
这里要注意一点,如果你的xsd没有namespace,直接parse xml会报错:(你的肯定和我的类似)
org.apache.xmlbeans.XmlException: E:/mydoc/mis.bak.xml:0: error: The document is not a awsmisconfig@http://xmlbeans.apache.org/mis/awsmisconfig: document element namespace mismatch expected “http://xmlbeans.apache.org/mis/awsmisconfig” got “”
at org.apache.xmlbeans.impl.store.Locale.verifyDocumentType(Locale.java:452)
at org.apache.xmlbeans.impl.store.Locale.autoTypeDocument(Locale.java:357)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1273)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1257)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:252)
at org.apache.xmlbeans.mis.awsmisconfig.AwsmisconfigDocument$Factory.parse(Unknown Source)
at com.actionsoft.awf.mis.config.ConfigUtil.readConfig(ConfigUtil.java:21)
at com.actionsoft.awf.mis.config.ConfigUtil.main(ConfigUtil.java:76)
其实xmlbean也意识到了这个问题,所以是有解决方法的,如下:
HashMap params = new HashMap();
params.put(“”, “http://xmlbeans.apache.org/mis/awsmisconfig”);//此处就是设置namespace
XmlOptions parseOptions = new XmlOptions();
parseOptions.setLoadSubstituteNamespaces(params);
PersonDocument doc = PersonDocument.Factory.parse(f ,parseOptions );
然后在解析就ok了!