Java对象与XML的相互转换

来源:互联网 发布:淘宝登录名可以改吗 编辑:程序博客网 时间:2024/04/30 19:01

最常用的就是SAX和Dom技术。下面来对这两个技术做一下比较,如下:

下面的表格列出了SAX和DOM在一些方面的对照: 
SAXDOM顺序读入文档并产生相应事件,可以处理任何大小的XML文档在内存中创建文档树,不适于处理大型XML文档。只能对文档按顺序解析一遍,不支持对文档的随意访问。可以随意访问文档树的任何部分,没有次数限制。只能读取XML文档内容,而不能修改可以随意修改文档树,从而修改XML文档。开发上比较复杂,需要自己来实现事件处理器。易于理解,易于开发。对开发人员而言更灵活,可以用SAX创建自己的XML对象模型。已经在DOM基础之上创建好了文档树。
通过对SAX和DOM的分析,它们各有自己的不同应用领域: 

    SAX适于处理下面的问题: 
    对大型文档进行处理。 
    只需要文档的部分内容,或者只需要从文档中得到特定信息。 
    想创建自己的对象模型的时候。 

DOM适于处理下面的问题: 

    需要对文档进行修改 
    需要随机对文档进行访问,例如XSLT解析器。 

关于使用如上两种技术进行XML和Java对象转换的包非常多,资料也非常齐全,这里就不多说了。需要说的是,目前在转换过程中,比较流程使用注解来进行转换,举个例子:

@XmlRootElement(name = "rootclass")public class RootClass {private ElementClassA a;private ElementClassB b;private String root;private String rootA;@XmlElement(name = "eleClassA")public ElementClassA getA() {return a;}public void setA(ElementClassA a) {this.a = a;}@XmlElement(name = "EleclassA")public ElementClassB getB() {return b;}public void setB(ElementClassB b) {this.b = b;}public String getRoot() {return root;}public void setRoot(String root) {this.root = root;}public String getRootA() {return rootA;}public void setRootA(String rootA) {this.rootA = rootA;}}
public class ElementClassA {private String eleA;private String eleB;private String attrC;@XmlElementpublic String getEleA() {return eleA;}public void setEleA(String eleA) {this.eleA = eleA;}@XmlElement(name = "elebnewname")public String getEleB() {return eleB;}public void setEleB(String eleB) {this.eleB = eleB;}@XmlAttribute()public String getAttrC() {return attrC;}public void setAttrC(String attrC) {this.attrC = attrC;}}
public class ElementClassB {private String attrUserName;private String attrPassword;private String eleCode;@XmlAttributepublic String getAttrUserName() {return attrUserName;}public void setAttrUserName(String attrUserName) {this.attrUserName = attrUserName;}@XmlAttribute(name="password")public String getAttrPassword() {return attrPassword;}public void setAttrPassword(String attrPassword) {this.attrPassword = attrPassword;}@XmlElementpublic String getEleCode() {return eleCode;}public void setEleCode(String eleCode) {this.eleCode = eleCode;}}
下面来生成XML文件的测试类如下:

public class Test {public static void main(String[] args) {RootClass rc = new RootClass();ElementClassA a = new ElementClassA();ElementClassB b = new ElementClassB();/** * <eleClassA attrC="attrc">             <eleA>eleA</eleA>             <elebnewname>eleB</elebnewname>           </eleClassA> */a.setAttrC("attrc");a.setEleA("eleA");a.setEleB("eleB");/* * <EleclassA password="attrPassword" attrUserName="attrUsrName">              <eleCode>eleCode</eleCode>           </EleclassA> */b.setAttrPassword("attrPassword");b.setAttrUserName("attrUsrName");b.setEleCode("eleCode");rc.setA(a);rc.setB(b);/** * <root>root</root>           <rootA>rootA</rootA> */rc.setRoot("root");rc.setRootA("rootA");JAXBContext context;try {context = JAXBContext.newInstance(RootClass.class);Marshaller mar = context.createMarshaller();mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);mar.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");StringWriter writer = new StringWriter();mar.marshal(rc, writer);System.out.println(writer.toString());} catch (JAXBException e) {e.printStackTrace();}}}
生成的XML文件如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><rootclass>    <eleClassA attrC="attrc">        <eleA>eleA</eleA>        <elebnewname>eleB</elebnewname>    </eleClassA>    <EleclassA password="attrPassword" attrUserName="attrUsrName">        <eleCode>eleCode</eleCode>    </EleclassA>    <root>root</root>    <rootA>rootA</rootA></rootclass>


现在又出来一个JiBx,使用的核心技术是BCEL(Byte Code Engineering Liberary),可以深入JVM汇编语言进行类操作。在JiBx运行时,使用了一种XPP技术,XPP使用不断增加的数据流处理方式 (不同于Dom和SAX的解析方式),同时允许在解析XML文件时中断,所以效率非常高。














0 0
原创粉丝点击