Java中对XML的解析详解

萌哒哒的菇凉

萌哒哒的菇凉

2016-02-19 09:56

今天图老师小编要向大家分享个Java中对XML的解析详解教程,过程简单易学,相信聪明的你一定能轻松get!

先简单说下前三种方式:

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 ListInterfaceConfigItem interfaceConfigList;
     public ListFtpConfigItem ftpConfigList;
     public ListAdapterConfigItem adapterConfigList;

     public void startDocument() throws SAXException {
         sysConfig = new SysConfigItem();
         interfaceConfigList = new ArrayListInterfaceConfigItem();
         ftpConfigList = new ArrayListFtpConfigItem();
         adapterConfigList = new ArrayListAdapterConfigItem();
     }

     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
    Version0100/Version
    TestFlag0/TestFlag
    BIPType
        BIPCodeBIP2B518/BIPCode
        ActivityCodeT2101518/ActivityCode
        ActionCode0/ActionCode
    /BIPType
    RoutingInfo
        OrigDomainBOSS/OrigDomain
        RouteTyperouteType/RouteType
        Routing
            HomeDomainXXXX/HomeDomain
            RouteValuerouteValue/RouteValue
        /Routing
    /RoutingInfo
    TransInfo
        SessionID2013041017222313925676/SessionID
        TransIDO2013041017222313925676/TransIDO
        TransIDOTime20130410172223/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
        RspTyperspType/RspType
        RspCoderspCode/RspCode
        RspDescrspDesc/RspDesc
    /Response
    SvcCont![CDATA[?xml version="1.0" encoding="UTF-8" standalone="yes"?
batchSyncOrderRelationReq
    msgTransactionID210001BIP2B518130410172223651627/msgTransactionID
    reqNum2/reqNum
    reqBody
        oprNumb210001BIP2B518130410172224341871/oprNumb
        subscriptionInfo
            oprTimeoprTime1/oprTime
            actionIDactionId1/actionID
            brandbrand1/brand
            effTimeeffTime1/effTime
            expireTimeexpireTime1/expireTime
            feeUser_IDfeeUserId1/feeUser_ID
            destUser_IDdestUserId1/destUser_ID
            actionReasonIDactionId1/actionReasonID
            servTypeservType1/servType
            subServTypesubServType1/subServType
            SPIDspId1/SPID
            SPServIDspServId1/SPServID
            accessModeaccessMode1/accessMode
            servParamInfo
                para_num0/para_num
                para_info
                    para_name/para_name
                    para_value/para_value
                /para_info
            /servParamInfo
            feeTypefeeType1/feeType
        /subscriptionInfo
    /reqBody
    reqBody
        oprNumb210001BIP2B518130410172224420909/oprNumb
        subscriptionInfo
            oprTimeoprTime2/oprTime
            actionIDactionId2/actionID
            brandbrand2/brand
            effTimeeffTime2/effTime
            expireTimeexpireTime2/expireTime
            feeUser_IDfeeUserId2/feeUser_ID
            destUser_IDdestUserId2/destUser_ID
            actionReasonIDactionId2/actionReasonID
            servTypeservType2/servType
            subServTypesubServType2/subServType
            SPIDspId2/SPID
            SPServIDspServId2/SPServID
            accessModeaccessMode2/accessMode
            servParamInfo
                para_num0/para_num
                para_info
                    para_name/para_name
                    para_value/para_value
                /para_info
            /servParamInfo
            feeTypefeeType2/feeType
        /subscriptionInfo
    /reqBody
/batchSyncOrderRelationReq]]/SvcCont
/InterBOSS

解码代码如下:
代码如下:

@XmlRootElement(name = "batchSyncOrderRelationReq")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class BatchSyncOrderRelationReq extends BossMessageBatchSyncOrderRelationReq {

     @XmlElement(name = "msgTransactionID")
     private String msgTransactionId = "";

     @XmlElement(name = "reqNum")
     private String reqNum = "";

     @XmlElement(name = "reqBody")
     private ListBatchSyncOrderRelationReqBody 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 ListBatchSyncOrderRelationReqBody getReqBodyList() {
         return this.reqBodyList;
     }

     public void setReqBodyList(ListBatchSyncOrderRelationReqBody 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(){

    }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

    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 = "";

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

    @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;
    }
}

展开更多 50%)
分享

猜你喜欢

Java中对XML的解析详解

编程语言 网络编程
Java中对XML的解析详解

Java中四种XML解析技术

Java JAVA基础
Java中四种XML解析技术

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java解析XML的四种方法详解

编程语言 网络编程
Java解析XML的四种方法详解

Php利用java解析xml

PHP
Php利用java解析xml

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Java中关于XML的API

Java JAVA基础
Java中关于XML的API

Php与java结合解析xml

PHP
Php与java结合解析xml

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win8系统自带重装还原工具

Win8系统自带重装还原工具

非常漂亮的让背景如此暗淡(一种弹出提示信息时页面背景色调改变的方法)

非常漂亮的让背景如此暗淡(一种弹出提示信息时页面背景色调改变的方法)
下拉加载更多内容 ↓