Parlons brièvement des trois premières méthodes :
Méthode DOM : Je comprends personnellement que XmlDocument similaire à .net n'est pas efficace lors de l'analyse, prend de la mémoire et n'est pas adapté à l'analyse de gros XML ;
Méthode SAX : analyse basée sur les événements. Lorsqu'une certaine partie du XML est analysée, un événement spécifique sera déclenché. Vous pouvez définir quoi faire lorsque l'événement est déclenché dans une classe d'analyse personnalisée. Je pense personnellement que c'est une très alternative. façon., je me demande s'il existe une méthode similaire sous le système .Net ?
Méthode StAX : je comprends personnellement qu'elle est similaire à la méthode XmlReader de .net, qui est très efficace, prend moins de mémoire et convient à l'analyse de fichiers XML volumineux ;
Cependant, la méthode SAX a déjà été utilisée. Cet article présente principalement JAXB. Seul le code principal est publié ici :
Copiez le code comme suit :
importer java.util.ArrayList ;
importer java.util.List ;
importer org.xml.sax.Attributes ;
importer org.xml.sax.SAXException ;
importer org.xml.sax.helpers.DefaultHandler ;
la classe publique ConfigParser étend DefaultHandler {
chaîne privée currentConfigSection ;
public SysConfigItem sysConfig ;
public List<InterfaceConfigItem> interfaceConfigList ;
liste publique<FtpConfigItem> ftpConfigList ;
public List<AdapterConfigItem> adapterConfigList ;
public void startDocument() lance SAXException {
sysConfig = nouveau SysConfigItem();
interfaceConfigList = new ArrayList<InterfaceConfigItem>();
ftpConfigList = new ArrayList<FtpConfigItem>();
adapterConfigList = new ArrayList<AdapterConfigItem>();
}
public void endDocument() lance SAXException {
}
public void startElement (String uri, String localName, String qName, Attributs attributs) lance SAXException {
if (qName.equalsIgnoreCase("Item") &&attributs.getLength() > 0) {
if (currentConfigSection.equalsIgnoreCase("SysConfigItem")) {
sysConfig = new SysConfigItem (attributs);
} sinon if (currentConfigSection.equalsIgnoreCase("InterfaceConfigItems")) {
interfaceConfigList.add (nouveau InterfaceConfigItem (attributs));
} sinon if (currentConfigSection.equalsIgnoreCase("FtpConfigItems")) {
ftpConfigList.add(nouveau FtpConfigItem(attributs));
} else if (currentConfigSection.equalsIgnoreCase("AdapterConfigItems")) {
adapterConfigList.add (nouveau AdapterConfigItem (attributs));
}
} autre {
currentConfigSection = qName;
}
}
public void endElement (String uri, String localName, String qName) lance SAXException {
}
les caractères publics vides (char ch[], int start, int length) lancent SAXException {
}
}
Copiez le code comme suit :
importer java.lang.reflect.Field ;
importer java.text.DateFormat ;
importer java.text.ParseException ;
importer java.text.SimpleDateFormat ;
importer java.util.Date ;
importer org.xml.sax.Attributes ;
classe publique ConfigItemBase {
private static DateFormat dateFormat = new SimpleDateFormat("aaaa-MM-jj HH:mm:ss");
public ConfigItemBase() {
}
/**
* Actuellement, seuls quelques types courants sont pris en charge. Si vous devez prendre en charge d'autres types, veuillez modifier le code ici.
*
* Attributs @param
*/
public ConfigItemBase (attributs d'attributs) {
Classe<?> cls = this.getClass();
Champs Field[] = cls.getDeclaredFields();
pour (Champ champ : champs) {
Chaîne fieldType = field.getType().getSimpleName();
pour (int i = 0; i < attributs.getLength(); i++) {
if (attributes.getQName(i).equalsIgnoreCase(field.getName())) {
field.setAccessible(true);
essayer {
if (fieldType.equalsIgnoreCase("String")) {
field.set(this, attributs.getValue(attributes.getQName(i)));
} sinon if (fieldType.equalsIgnoreCase("Integer")) {
field.set(this, Integer.valueOf(attributes.getValue(attributes.getQName(i))));
} sinon if (fieldType.equalsIgnoreCase("Double")) {
field.set(this, Double.valueOf(attributes.getValue(attributes.getQName(i))));
} sinon if (fieldType.equalsIgnoreCase("Date")) {
field.set(this, GetDate(attributes.getValue(attributes.getQName(i))));
} autre {
System.out.println("Avertissement:Unhandler Field(" + field.getName() + "-" + fieldType + ")");
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
casser;
}
}
}
}
chaîne publique versChaîne() {
Résultat de la chaîne = "" ;
Classe<?> cls = this.getClass();
Chaîne classNameString = cls.getName();
résultat += classNameString.substring(classNameString.lastIndexOf('.') + 1, classNameString.length()) + ":";
Champs Field[] = cls.getDeclaredFields();
pour (Champ champ : champs) {
essayer {
result += field.getName() + "=" + field.get(this) + ";";
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
renvoyer le résultat ;
}
/**
* Attributs de type d'heure de traitement (le format d'heure requis est : aaaa-MM-jj hh:mm:ss)
*
* @param dateString
* @retour
*/
Date statique privée GetDate (String dateString) {
Date date = nulle ;
essayer {
date = dateFormat.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
date de retour ;
}
}
Ce qui suit se concentre sur le plus pratique : JAXB (Java Architecture for XML Binding)
Ici, nous utilisons l'interface mobile XML plus complexe BatchSyncOrderRelationReq comme exemple (je pense que tous ceux qui peuvent comprendre cela sont fondamentalement suffisants), le format du message est le suivant (le contenu CDATA dans SvcCont est le corps du message, ce qui est dégoûtant) :
Copiez le code comme suit :
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<InterBOSS>
<Version>0100</Version>
<TestFlag>0</TestFlag>
<TypeBIP>
<BIPCode>BIP2B518</BIPCode>
<ActivityCode>T2101518</ActivityCode>
<CodeAction>0</CodeAction>
</BIPType>
<Informations de routage>
<OrigDomain>BOSS</OrigDomain>
<RouteType>routeType</RouteType>
<Routage>
<Domaine personnel>XXXX</Domaine personnel>
<RouteValue>routeValue</RouteValue>
</Routage>
</InfoRoutage>
<TransInfo>
<SessionID>2013041017222313925676</SessionID>
<TransIDO>2013041017222313925676</TransIDO>
<TransIDOTime>20130410172223</TransIDOTime>
<TransIDH></TransIDH>
<TransIDHTime></TransIDHTime>
</TransInfo>
<SNRéserve>
<TransIDC></TransIDC>
<ConvID></ConvID>
<Jour Coupé></Jour Coupé>
<OSNTime></OSNTime>
<OSNDUNS></OSNDUNS>
<HSNDUNS></HSNDUNS>
<MsgSender></MsgSender>
<MsgReceiver></MsgReceiver>
<Priorité></Priorité>
<ServiceNiveau></ServiceNiveau>
<SvcContType></SvcContType>
</SNRéserve>
<Réponse>
<RspType>rspType</RspType>
<RspCode>rspCode</RspCode>
<RspDesc>rspDesc</RspDesc>
</Réponse>
<SvcCont><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<batchSyncOrderRelationReq>
<msgTransactionID>210001BIP2B518130410172223651627</msgTransactionID>
<reqNum>2</reqNum>
<corpsreq>
<oprNumb>210001BIP2B518130410172224341871</oprNumb>
<informations sur l'abonnement>
<oprTime>oprTime1</oprTime>
<actionID>actionId1</actionID>
<marque>marque1</marque>
<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>
</abonnementInfo>
</reqBody>
<corpsreq>
<oprNumb>210001BIP2B518130410172224420909</oprNumb>
<informations sur l'abonnement>
<oprTime>oprTime2</oprTime>
<actionID>actionId2</actionID>
<marque>marque2</marque>
<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>
</abonnementInfo>
</reqBody>
</batchSyncOrderRelationReq>]]></SvcCont>
</InterBOSS>
Le code de décodage est le suivant :
Copiez le code comme suit :
@XmlRootElement(nom = "batchSyncOrderRelationReq")
@XmlAccessorType(XmlAccessType.FIELD)
la classe publique BatchSyncOrderRelationReq étend BossMessage<BatchSyncOrderRelationReq> {
@XmlElement(nom = "msgTransactionID")
chaîne privée msgTransactionId = "" ;
@XmlElement(nom = "reqNum")
chaîne privée reqNum = "" ;
@XmlElement(nom = "reqBody")
liste privée<BatchSyncOrderRelationReqBody> reqBodyList ;
public BatchSyncOrderRelationReq() {
}
chaîne publique getMsgTransactionId() {
renvoie this.msgTransactionId ;
}
public void setMsgTransactionId(String msgTransactionId) {
this.msgTransactionId = msgTransactionId;
}
chaîne publique getReqNum() {
renvoie this.reqNum ;
}
public void setReqNum(String reqNum) {
this.reqNum = reqNum ;
}
public List<BatchSyncOrderRelationReqBody> getReqBodyList() {
renvoie this.reqBodyList ;
}
public void setReqBodyList(List<BatchSyncOrderRelationReqBody> reqBodyList) {
this.reqBodyList = reqBodyList ;
}
@Outrepasser
public BatchSyncOrderRelationReq Deserialized (String interBossXmlContent) lance BusinessException {
essayer {
// désérialisé pour la tête
JAXBContext jaxbCxt4Head = JAXBContext.newInstance(MessageHead.class);
Unmarshaller unmarshaller4Head = jaxbCxt4Head.createUnmarshaller();
MessageHead head = (MessageHead) unmarshaller4Head.unmarshal(new StringReader(interBossXmlContent));
// désérialisé pour le corps SyncOrderRelationReq
JAXBContext jaxbCxt4Body = JAXBContext.newInstance(BatchSyncOrderRelationReq.class);
Unmarshaller unmarshaller4Body = jaxbCxt4Body.createUnmarshaller();
BatchSyncOrderRelationReq batchSyncOrderRelationReq = (BatchSyncOrderRelationReq) unmarshaller4Body.unmarshal(new StringReader(head.getSvcCont().trim()));
batchSyncOrderRelationReq.setHead(head);
renvoyer batchSyncOrderRelationReq ;
} catch (JAXBException e) {
throw new BusinessException("SyncOrderRelationReq.Deserialized() Error!(" + interBossXmlContent + ")", e);
}
}
}
@XmlAccessorType(XmlAccessType.FIELD)
Copiez le code comme suit :
classe publique BatchSyncOrderRelationReqBody {
@XmlElement(nom = "oprNumb")
chaîne privée oprNumb = "" ;
@XmlElement(name = "subscriptionInfo")
privé SubscriptionInfo souscriptionInfo;
public BatchSyncOrderRelationReqBody(){
}
public BatchSyncOrderRelationReqBody (String oprNumb, SubscriptionInfo souscriptionInfo) {
this.oprNumb = oprNumb ;
this.subscriptionInfo = souscriptionInfo;
}
chaîne publique getOprNumb() {
renvoie this.oprNumb ;
}
public void setOprNumb(String oprNumb) {
this.oprNumb = oprNumb ;
}
public SubscriptionInfo getSubscriptionInfo() {
renvoie this.subscriptionInfo ;
}
public void setSubscriptionInfo(SubscriptionInfo souscriptionInfo) {
this.subscriptionInfo = souscriptionInfo;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
Copiez le code comme suit :
classe publique SubscriptionInfo {
@XmlElement(nom = "oprTime")
chaîne privée oprTime = "" ;
@XmlElement(nom = "actionID")
chaîne privée actionId = "" ;
@XmlElement(name = "marque")
marque de chaîne privée = "" ;
@XmlElement(nom = "effTime")
chaîne privée effTime = "" ;
@XmlElement(name = "expireTime")
private String expireTime = "";
@XmlElement(nom = "feeUser_ID")
private String feeUserId = "";
@XmlElement(name = "destUser_ID")
chaîne privée destUserId = "" ;
@XmlElement(nom = "actionReasonID")
chaîne privée actionReasonId = "" ;
@XmlElement(nom = "servType")
chaîne privée servType = "" ;
@XmlElement(nom = "subServType")
chaîne privée subServType = "" ;
@XmlElement(nom = "SPID")
chaîne privée spId = "" ;
@XmlElement(nom = "SPServID")
chaîne privée spServId = "" ;
@XmlElement(nom = "accessMode")
chaîne privée accessMode = "" ;
@XmlElement(nom = "feeType")
private String feeType = "";
public SubscriptionInfo() {
}
informations d'abonnement publiques (
Chaîne oprTime,
ID d'action de chaîne,
Marque de ficelle,
Chaîne effTime,
Chaîne expireTime,
Frais de chaîneUserId,
Chaîne destUserId,
Chaîne actionReasonId,
Chaîne servType,
Chaîne sousServType,
ID de chaîne,
Chaîne spServId,
Mode d'accès à la chaîne,
Chaîne feeType) {
this.oprTime = oprTime ;
this.actionId = actionId;
this.brand = marque ;
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;
}
chaîne publique getOprTime() {
renvoie this.oprTime ;
}
public void setOprTime (String oprTime) {
this.oprTime = oprTime ;
}
chaîne publique getActionId() {
renvoie this.actionId ;
}
public void setActionId (String actionId) {
this.actionId = actionId;
}
chaîne publique getBrand() {
renvoyer this.brand ;
}
public void setBrand (marque de chaîne) {
this.brand = marque ;
}
chaîne publique getEffTime() {
renvoie this.effTime ;
}
public void setEffTime(String effTime) {
this.effTime = effTime ;
}
chaîne publique getExpireTime() {
renvoie this.expireTime ;
}
public void setExpireTime (String expireTime) {
this.expireTime = expireTime ;
}
chaîne publique getFeeUserId() {
renvoie this.feeUserId ;
}
public void setFeeUserId(String feeUserId) {
this.feeUserId = feeUserId ;
}
chaîne publique getDestUserId() {
renvoie this.destUserId ;
}
public void setDestUserId(String destUserId) {
this.destUserId = destUserId ;
}
chaîne publique getActionReasonId() {
renvoie this.actionReasonId ;
}
public void setActionReasonId (String actionReasonId) {
this.actionReasonId = actionReasonId;
}
chaîne publique getServType() {
renvoie this.servType ;
}
public void setServType (String servType) {
this.servType = servType;
}
chaîne publique getSubServType() {
renvoie this.subServType ;
}
public void setSubServType (String subServType) {
this.subServType = subServType ;
}
chaîne publique getSpId() {
renvoie this.spId ;
}
public void setSpId(String spId) {
this.spId = spId;
}
chaîne publique getSpServId() {
renvoie this.spServId ;
}
public void setSpServId(String spServId) {
this.spServId = spServId ;
}
chaîne publique getAccessMode() {
renvoie this.accessMode ;
}
public void setAccessMode (String accessMode) {
this.accessMode = accessMode;
}
chaîne publique getFeeType() {
renvoie this.feeType ;
}
public void setFeeType(String feeType) {
this.feeType = feeType;
}
}