栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 人工智能 > NLP

Java中对XML的解析详解

NLP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中对XML的解析详解

先简单说下前三种方式:

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 interfaceConfigList;     public List ftpConfigList;     public List adapterConfigList;     public void startdocument() throws SAXException {         sysConfig = new SysConfigItem();         interfaceConfigList = new ArrayList();         ftpConfigList = new ArrayList();         adapterConfigList = new ArrayList();     }     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() {    }        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;    }        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内容是报文体,太恶心了):

    0100    0            BIP2B518        T2101518        0                BOSS        routeType                    XXXX            routevalue                        2013041017222313925676        2013041017222313925676        20130410172223                                                                                                                                rspType        rspCode        rspDesc            210001BIP2B518130410172223651627    2            210001BIP2B518130410172224341871                    oprTime1            actionId1            brand1            effTime1            expireTime1            feeUserId1            destUserId1            actionId1            servType1            subServType1            spId1            spServId1            accessMode1                            0                                                                                                feeType1                        210001BIP2B518130410172224420909                    oprTime2            actionId2            brand2            effTime2            expireTime2            feeUserId2            destUserId2            actionId2            servType2            subServType2            spId2            spServId2            accessMode2                            0                                                                                                feeType2            ]]>

解码代码如下:

@XmlRootElement(name = "batchSyncOrderRelationReq") @XmlAccessorType(XmlAccessType.FIELD) public class BatchSyncOrderRelationReq extends BossMessage {     @XmlElement(name = "msgTransactionID")     private String msgTransactionId = "";     @XmlElement(name = "reqNum")     private String reqNum = "";     @XmlElement(name = "reqBody")     private List 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 getReqBodyList() {         return this.reqBodyList;     }     public void setReqBodyList(List 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中文网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/794923.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号