처음 세 가지 방법에 대해 간략하게 이야기해 보겠습니다.
DOM 방법: 개인적으로 .net의 XmlDocument와 비슷하다고 이해하는데, 파싱할 때 효율적이지 않고, 메모리도 많이 차지하고, DOM에 적합하지 않습니다.
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 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 { } }
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> <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>
디코딩 코드는 다음과 같습니다.
@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); } } }
@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; } }
Java의 XML 파싱에 대한 자세한 설명 및 관련 글은 PHP 중국어 홈페이지를 참고해주세요. !