Java下3中XML解析 DOM方式、SAX方式和StAX方式

1切都不是真的

1切都不是真的

2016-02-19 10:33

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的Java下3中XML解析 DOM方式、SAX方式和StAX方式,过去的都会过去,迎接崭新的开始,释放更美好的自己。

先简单说下前三种方式:

DOM方式:个人理解类似.net的XmlDocument,解析的时候效率不高,占用内存,不适合大XML的解析;
SAX方式:基于事件的解析,当解析到xml的某个部分的时候,会触发特定事件,可以在自定义的解析类中定义当事件触发时要做得事情;个人感觉一种很另类的方式,不知道.Net体系下是否有没有类似的方式?
StAX方式:个人理解类似.net的XmlReader方式,效率高,占用内存少,适用大XML的解析;
不过SAX方式之前也用过,本文主要介绍JAXB,这里只贴下主要代码:

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

代码如下:

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)

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

这里用比较复杂的移动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(){
  }
  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;
  }
}

展开更多 50%)
分享

猜你喜欢

Java下3中XML解析 DOM方式、SAX方式和StAX方式

编程语言 网络编程
Java下3中XML解析 DOM方式、SAX方式和StAX方式

java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解

编程语言 网络编程
java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解

s8lol主宰符文怎么配

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

XML 数据的编码方式

ASP
XML 数据的编码方式

Android中使用PULL方式解析XML文件深入介绍

编程语言 网络编程
Android中使用PULL方式解析XML文件深入介绍

lol偷钱流符文搭配推荐

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

JAVA编程中异常问题处理方式的区别和分析

编程语言 网络编程
JAVA编程中异常问题处理方式的区别和分析

jquery JSON的解析方式

Web开发
jquery JSON的解析方式

lolAD刺客新符文搭配推荐

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

用javascript编写的第一人称射击游戏

用javascript编写的第一人称射击游戏

Linux系统中C语言编程创建函数fork()执行解析

Linux系统中C语言编程创建函数fork()执行解析
下拉加载更多内容 ↓