源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java中对XML的解析详解

  • 时间:2022-09-22 01:34 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java中对XML的解析详解
[b]先简单说下前三种方式:[/b] [b]DOM方式:[/b]个人理解类似.net的XmlDocument,解析的时候效率不高,占用内存,不适合大XML的解析; [b]SAX方式:[/b]基于事件的解析,当解析到xml的某个部分的时候,会触发特定事件,可以在自定义的解析类中定义当事件触发时要做得事情;个人感觉一种很另类的方式,不知道.Net体系下是否有没有类似的方式? [b]StAX方式:[/b]个人理解类似.net的XmlReader方式,效率高,占用内存少,适用大XML的解析; 不过SAX方式之前也用过,本文主要介绍JAXB,这里只贴下主要代码:
[u]复制代码[/u] 代码如下:
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 {      }  }
[u]复制代码[/u] 代码如下:
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;     } }
[b]下面重点介绍一下最方便的:[/b]JAXB(Java Architecture for XML Binding) 这里用比较复杂的移动BatchSyncOrderRelationReq接口XML做为示例(感觉能解这个大家基本上够用了),报文格式如下(SvcCont里的CDATA内容是报文体,太恶心了):
[u]复制代码[/u] 代码如下:
<?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>
解码代码如下:
[u]复制代码[/u] 代码如下:
@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);          }      }  }
[u]复制代码[/u] 代码如下:
@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;     } }
[u]复制代码[/u] 代码如下:
@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;     } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部