Home  >  Article  >  Backend Development  >  Detailed explanation of XML parsing in Java

Detailed explanation of XML parsing in Java

高洛峰
高洛峰Original
2017-01-11 13:00:462023browse

Let’s briefly talk about the first three methods:

DOM method: Personal understanding is similar to .net’s XmlDocument, which is not efficient when parsing, takes up memory, and is not suitable for parsing large XML;

SAX method: event-based parsing. When a certain part of xml is parsed, a specific event will be triggered. You can define what to do when the event is triggered in a custom parsing class; I personally feel that it is very different. method, I wonder if there is a similar method under the .Net system?

StAX method: I personally understand that it is similar to the .net XmlReader method, which is highly efficient, takes up less memory, and is suitable for parsing large XML;

However, the SAX method has been used before. This article mainly introduces JAXB. Only the main code is posted here:

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() {
    }
    /**
     * 目前只支持几种常用类型 如果需要支持其他类型,请修改这里的代码
     * 
     * @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;
    }
}

The following focuses on the most convenient one: JAXB (Java Architecture for XML Binding)
Here we use the more complex mobile BatchSyncOrderRelationReq interface XML as an example (I feel like I can solve this Basically enough for everyone), the message format is as follows (the CDATA content in SvcCont is the message body, which is disgusting):



    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
        
    
]]>

The decoding code is as follows:

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

More pairs in Java Please pay attention to the PHP Chinese website for related articles on XML parsing and detailed explanation!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn