先简单说下前三种方式:

DOM方式:个人理解类似.net的XmlDocument,解析的时候效率不高,占用内存,不适合大XML的解析;

SAX方式:基于事件的解析,当解析到xml的某个部分的时候,会触发特定事件,可以在自定义的解析类中定义当事件触发时要做得事情;个人感觉一种很另类的方式,不知道.Net体系下是否有没有类似的方式?

StAX方式:个人理解类似.net的XmlReader方式,效率高,占用内存少,适用大XML的解析;

不过SAX方式之前也用过,本文主要介绍JAXB,这里只贴下主要代码:

import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class ConfigParser extends DefaultHandler {     private String currentConfigSection;     public SysConfigItem sysConfig;     public List<InterfaceConfigItem> interfaceConfigList;     public List<FtpConfigItem> ftpConfigList;     public List<AdapterConfigItem> adapterConfigList;     public void startDocument() throws SAXException {         sysConfig = new SysConfigItem();         interfaceConfigList = new ArrayList<InterfaceConfigItem>();         ftpConfigList = new ArrayList<FtpConfigItem>();         adapterConfigList = new ArrayList<AdapterConfigItem>();     }     public void endDocument() throws SAXException {     }     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {         if (qName.equalsIgnoreCase("Item") && attributes.getLength() > 0) {             if (currentConfigSection.equalsIgnoreCase("SysConfigItem")) {                 sysConfig = new SysConfigItem(attributes);             } else if (currentConfigSection.equalsIgnoreCase("InterfaceConfigItems")) {                 interfaceConfigList.add(new InterfaceConfigItem(attributes));             } else if (currentConfigSection.equalsIgnoreCase("FtpConfigItems")) {                 ftpConfigList.add(new FtpConfigItem(attributes));             } else if (currentConfigSection.equalsIgnoreCase("AdapterConfigItems")) {                 adapterConfigList.add(new AdapterConfigItem(attributes));             }         } else {             currentConfigSection = qName;         }     }     public void endElement(String uri, String localName, String qName) throws SAXException {     }     public void characters(char ch[], int start, int length) throws SAXException {     } }
import java.lang.reflect.Field;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import org.xml.sax.Attributes;public class ConfigItemBase {    private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    public ConfigItemBase() {    }    /**     * 目前只支持几种常用类型 如果需要支持其他类型,请修改这里的代码     *      * @param attributes     */    public ConfigItemBase(Attributes attributes) {        Class<?> cls = this.getClass();        Field[] fields = cls.getDeclaredFields();        for (Field field : fields) {            String fieldType = field.getType().getSimpleName();            for (int i = 0; i < attributes.getLength(); i++) {                if (attributes.getQName(i).equalsIgnoreCase(field.getName())) {                    field.setAccessible(true);                    try {                        if (fieldType.equalsIgnoreCase("String")) {                            field.set(this, attributes.getValue(attributes.getQName(i)));                        } else if (fieldType.equalsIgnoreCase("Integer")) {                            field.set(this, Integer.valueOf(attributes.getValue(attributes.getQName(i))));                        } else if (fieldType.equalsIgnoreCase("Double")) {                            field.set(this, Double.valueOf(attributes.getValue(attributes.getQName(i))));                        } else if (fieldType.equalsIgnoreCase("Date")) {                            field.set(this, GetDate(attributes.getValue(attributes.getQName(i))));                        } else {                            System.out.println("Warning:Unhandler Field(" + field.getName() + "-" + fieldType + ")");                        }                    } catch (IllegalArgumentException e) {                        e.printStackTrace();                    } catch (IllegalAccessException e) {                        e.printStackTrace();                    }                    break;                }            }        }    }    public String toString() {        String result = "";        Class<?> cls = this.getClass();        String classNameString = cls.getName();        result += classNameString.substring(classNameString.lastIndexOf('.') + 1, classNameString.length()) + ":";        Field[] fields = cls.getDeclaredFields();        for (Field field : fields) {            try {                result += field.getName() + "=" + field.get(this) + ";";            } catch (IllegalArgumentException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            }        }        return result;    }    /**     * 处理时间类型属性(时间格式要求为:yyyy-MM-dd hh:mm:ss)     *      * @param dateString     * @return     */    private static Date GetDate(String dateString) {        Date date = null;        try {            date = dateFormat.parse(dateString);        } catch (ParseException e) {            e.printStackTrace();        }        return date;    }}

下面重点介绍一下最方便的:JAXB(Java Architecture for XML Binding)
这里用比较复杂的移动BatchSyncOrderRelationReq接口XML做为示例(感觉能解这个大家基本上够用了),报文格式如下(SvcCont里的CDATA内容是报文体,太恶心了):

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><InterBOSS>    <Version>0100</Version>    <TestFlag>0</TestFlag>    <BIPType>        <BIPCode>BIP2B518</BIPCode>        <ActivityCode>T2101518</ActivityCode>        <ActionCode>0</ActionCode>    </BIPType>    <RoutingInfo>        <OrigDomain>BOSS</OrigDomain>        <RouteType>routeType</RouteType>        <Routing>            <HomeDomain>XXXX</HomeDomain>            <RouteValue>routeValue</RouteValue>        </Routing>    </RoutingInfo>    <TransInfo>        <SessionID>2013041017222313925676</SessionID>        <TransIDO>2013041017222313925676</TransIDO>        <TransIDOTime>20130410172223</TransIDOTime>        <TransIDH></TransIDH>        <TransIDHTime></TransIDHTime>    </TransInfo>    <SNReserve>        <TransIDC></TransIDC>        <ConvID></ConvID>        <CutOffDay></CutOffDay>        <OSNTime></OSNTime>        <OSNDUNS></OSNDUNS>        <HSNDUNS></HSNDUNS>        <MsgSender></MsgSender>        <MsgReceiver></MsgReceiver>        <Priority></Priority>        <ServiceLevel></ServiceLevel>        <SvcContType></SvcContType>    </SNReserve>    <Response>        <RspType>rspType</RspType>        <RspCode>rspCode</RspCode>        <RspDesc>rspDesc</RspDesc>    </Response>    <SvcCont><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?><batchSyncOrderRelationReq>    <msgTransactionID>210001BIP2B518130410172223651627</msgTransactionID>    <reqNum>2</reqNum>    <reqBody>        <oprNumb>210001BIP2B518130410172224341871</oprNumb>        <subscriptionInfo>            <oprTime>oprTime1</oprTime>            <actionID>actionId1</actionID>            <brand>brand1</brand>            <effTime>effTime1</effTime>            <expireTime>expireTime1</expireTime>            <feeUser_ID>feeUserId1</feeUser_ID>            <destUser_ID>destUserId1</destUser_ID>            <actionReasonID>actionId1</actionReasonID>            <servType>servType1</servType>            <subServType>subServType1</subServType>            <SPID>spId1</SPID>            <SPServID>spServId1</SPServID>            <accessMode>accessMode1</accessMode>            <servParamInfo>                <para_num>0</para_num>                <para_info>                    <para_name></para_name>                    <para_value></para_value>                </para_info>            </servParamInfo>            <feeType>feeType1</feeType>        </subscriptionInfo>    </reqBody>    <reqBody>        <oprNumb>210001BIP2B518130410172224420909</oprNumb>        <subscriptionInfo>            <oprTime>oprTime2</oprTime>            <actionID>actionId2</actionID>            <brand>brand2</brand>            <effTime>effTime2</effTime>            <expireTime>expireTime2</expireTime>            <feeUser_ID>feeUserId2</feeUser_ID>            <destUser_ID>destUserId2</destUser_ID>            <actionReasonID>actionId2</actionReasonID>            <servType>servType2</servType>            <subServType>subServType2</subServType>            <SPID>spId2</SPID>            <SPServID>spServId2</SPServID>            <accessMode>accessMode2</accessMode>            <servParamInfo>                <para_num>0</para_num>                <para_info>                    <para_name></para_name>                    <para_value></para_value>                </para_info>            </servParamInfo>            <feeType>feeType2</feeType>        </subscriptionInfo>    </reqBody></batchSyncOrderRelationReq>]]></SvcCont></InterBOSS>

解码代码如下:

@XmlRootElement(name = "batchSyncOrderRelationReq") @XmlAccessorType(XmlAccessType.FIELD) public class BatchSyncOrderRelationReq extends BossMessage<BatchSyncOrderRelationReq> {     @XmlElement(name = "msgTransactionID")     private String msgTransactionId = "";     @XmlElement(name = "reqNum")     private String reqNum = "";     @XmlElement(name = "reqBody")     private List<BatchSyncOrderRelationReqBody> reqBodyList;     public BatchSyncOrderRelationReq() {     }     public String getMsgTransactionId() {         return this.msgTransactionId;     }     public void setMsgTransactionId(String msgTransactionId) {         this.msgTransactionId = msgTransactionId;     }     public String getReqNum() {         return this.reqNum;     }     public void setReqNum(String reqNum) {         this.reqNum = reqNum;     }     public List<BatchSyncOrderRelationReqBody> getReqBodyList() {         return this.reqBodyList;     }     public void setReqBodyList(List<BatchSyncOrderRelationReqBody> reqBodyList) {         this.reqBodyList = reqBodyList;     }     @Override     public BatchSyncOrderRelationReq Deserialized(String interBossXmlContent) throws BusinessException {         try {             // deserialized for head             JAXBContext jaxbCxt4Head = JAXBContext.newInstance(MessageHead.class);             Unmarshaller unmarshaller4Head = jaxbCxt4Head.createUnmarshaller();             MessageHead head = (MessageHead) unmarshaller4Head.unmarshal(new StringReader(interBossXmlContent));             // deserialized for SyncOrderRelationReq body             JAXBContext jaxbCxt4Body = JAXBContext.newInstance(BatchSyncOrderRelationReq.class);             Unmarshaller unmarshaller4Body = jaxbCxt4Body.createUnmarshaller();             BatchSyncOrderRelationReq batchSyncOrderRelationReq = (BatchSyncOrderRelationReq) unmarshaller4Body.unmarshal(new StringReader(head.getSvcCont().trim()));             batchSyncOrderRelationReq.setHead(head);             return batchSyncOrderRelationReq;         } catch (JAXBException e) {             throw new BusinessException("SyncOrderRelationReq.Deserialized() Error!(" + interBossXmlContent + ")", e);         }     } }
@XmlAccessorType(XmlAccessType.FIELD)public class BatchSyncOrderRelationReqBody {    @XmlElement(name = "oprNumb")    private String oprNumb = "";    @XmlElement(name = "subscriptionInfo")    private SubscriptionInfo subscriptionInfo;    public BatchSyncOrderRelationReqBody(){    }    public BatchSyncOrderRelationReqBody(String oprNumb, SubscriptionInfo subscriptionInfo) {        this.oprNumb = oprNumb;        this.subscriptionInfo = subscriptionInfo;    }    public String getOprNumb() {        return this.oprNumb;    }    public void setOprNumb(String oprNumb) {        this.oprNumb = oprNumb;    }    public SubscriptionInfo getSubscriptionInfo() {        return this.subscriptionInfo;    }    public void setSubscriptionInfo(SubscriptionInfo subscriptionInfo) {        this.subscriptionInfo = subscriptionInfo;    }}
@XmlAccessorType(XmlAccessType.FIELD)public class SubscriptionInfo {    @XmlElement(name = "oprTime")    private String oprTime = "";    @XmlElement(name = "actionID")    private String actionId = "";    @XmlElement(name = "brand")    private String brand = "";    @XmlElement(name = "effTime")    private String effTime = "";    @XmlElement(name = "expireTime")    private String expireTime = "";    @XmlElement(name = "feeUser_ID")    private String feeUserId = "";    @XmlElement(name = "destUser_ID")    private String destUserId = "";    @XmlElement(name = "actionReasonID")    private String actionReasonId = "";    @XmlElement(name = "servType")    private String servType = "";    @XmlElement(name = "subServType")    private String subServType = "";    @XmlElement(name = "SPID")    private String spId = "";    @XmlElement(name = "SPServID")    private String spServId = "";    @XmlElement(name = "accessMode")    private String accessMode = "";    @XmlElement(name = "feeType")    private String feeType = "";    public SubscriptionInfo() {    }    public SubscriptionInfo(            String oprTime,            String actionId,            String brand,            String effTime,            String expireTime,            String feeUserId,            String destUserId,            String actionReasonId,            String servType,            String subServType,            String spId,            String spServId,            String accessMode,            String feeType) {        this.oprTime = oprTime;        this.actionId = actionId;        this.brand = brand;        this.effTime = effTime;        this.expireTime = expireTime;        this.feeUserId = feeUserId;        this.destUserId = destUserId;        this.actionReasonId = actionReasonId;        this.servType = servType;        this.subServType = subServType;        this.spId = spId;        this.spServId = spServId;        this.accessMode = accessMode;        this.feeType = feeType;    }    public String getOprTime() {        return this.oprTime;    }    public void setOprTime(String oprTime) {        this.oprTime = oprTime;    }    public String getActionId() {        return this.actionId;    }    public void setActionId(String actionId) {        this.actionId = actionId;    }    public String getBrand() {        return this.brand;    }    public void setBrand(String brand) {        this.brand = brand;    }    public String getEffTime() {        return this.effTime;    }    public void setEffTime(String effTime) {        this.effTime = effTime;    }    public String getExpireTime() {        return this.expireTime;    }    public void setExpireTime(String expireTime) {        this.expireTime = expireTime;    }    public String getFeeUserId() {        return this.feeUserId;    }    public void setFeeUserId(String feeUserId) {        this.feeUserId = feeUserId;    }    public String getDestUserId() {        return this.destUserId;    }    public void setDestUserId(String destUserId) {        this.destUserId = destUserId;    }    public String getActionReasonId() {        return this.actionReasonId;    }    public void setActionReasonId(String actionReasonId) {        this.actionReasonId = actionReasonId;    }    public String getServType() {        return this.servType;    }    public void setServType(String servType) {        this.servType = servType;    }    public String getSubServType() {        return this.subServType;    }    public void setSubServType(String subServType) {        this.subServType = subServType;    }    public String getSpId() {        return this.spId;    }    public void setSpId(String spId) {        this.spId = spId;    }    public String getSpServId() {        return this.spServId;    }    public void setSpServId(String spServId) {        this.spServId = spServId;    }    public String getAccessMode() {        return this.accessMode;    }    public void setAccessMode(String accessMode) {        this.accessMode = accessMode;    }    public String getFeeType() {        return this.feeType;    }    public void setFeeType(String feeType) {        this.feeType = feeType;    }}

更多Java中对XML的解析详解相关文章请关注PHP中文网!

更多相关文章

  1. android pull 解析xml方式
  2. XML(2)通过XmlDocument与XDocument方式写入XML
  3. 四种XML解析方式详解
  4. XML数据读取方式性能比较(一)
  5. XML数据读取方式性能比较(二)
  6. xml解析方式之JAXP解析入门
  7. android dom 解析xml方式

随机推荐

  1. phonegap与openlayers混搭在android上显
  2. 搭建IPC通信框架(RPC)
  3. 提供一些Android免费课程分享给大家
  4. 修改系统action bar字体大小、粗细、颜色
  5. 强制保持Android(安卓)Activity状态
  6. Android下载文本文件和mp3文件
  7. VectorDrawable
  8. 解决android TextView多行文本(超过3行)使
  9. Android(安卓)关于百度地图Android(安卓)
  10. 可以看到android源码的网站