มาพูดคุยสั้น ๆ เกี่ยวกับสามวิธีแรก:
วิธี DOM : ฉันเข้าใจเป็นการส่วนตัวว่า XmlDocument ที่คล้ายกับ .net นั้นไม่ได้มีประสิทธิภาพในการแยกวิเคราะห์ ใช้หน่วยความจำ และไม่เหมาะสำหรับการแยกวิเคราะห์ XML ขนาดใหญ่
วิธี SAX : การแยกวิเคราะห์ตามเหตุการณ์ เมื่อบางส่วนของ xml ถูกแยกวิเคราะห์ เหตุการณ์เฉพาะจะถูกทริกเกอร์ คุณสามารถกำหนดสิ่งที่ต้องทำเมื่อเหตุการณ์ถูกทริกเกอร์ในคลาสการแยกวิเคราะห์ที่กำหนดเอง โดยส่วนตัวแล้วฉันรู้สึกว่ามันเป็นทางเลือกหนึ่ง ทาง ฉันสงสัยว่ามีวิธีที่คล้ายกันภายใต้ระบบ .Net หรือไม่?
วิธี StAX : โดยส่วนตัวแล้วฉันเข้าใจว่ามันคล้ายกับวิธี XmlReader ของ .net ซึ่งมีประสิทธิภาพสูง ใช้หน่วยความจำน้อยกว่า และเหมาะสำหรับการแยกวิเคราะห์ XML ขนาดใหญ่
อย่างไรก็ตาม ก่อนหน้านี้มีการใช้วิธี SAX บทความนี้จะแนะนำ JAXB เป็นหลักเท่านั้น
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.util.ArrayList;
นำเข้า java.util.List;
นำเข้า org.xml.sax.Attributes;
นำเข้า org.xml.sax.SAXException;
นำเข้า org.xml.sax.helpers.DefaultHandler;
ConfigParser คลาสสาธารณะขยาย DefaultHandler {
สตริงส่วนตัว currentConfigSection;
SysConfigItem สาธารณะ sysConfig;
รายการสาธารณะ <InterfaceConfigItem> interfaceConfigList;
รายการสาธารณะ <FtpConfigItem> ftpConfigList;
รายการสาธารณะ <AdapterConfigItem> adapterConfigList;
โมฆะสาธารณะ startDocument () พ่น SAXException {
sysConfig = SysConfigItem ใหม่ ();
interfaceConfigList = ArrayList ใหม่ <InterfaceConfigItem>();
ftpConfigList = ArrayList ใหม่<FtpConfigItem>();
adapterConfigList = ArrayList ใหม่<AdapterConfigItem>();
-
โมฆะสาธารณะ endDocument () พ่น SAXException {
-
โมฆะสาธารณะ startElement (สตริง uri, สตริงชื่อท้องถิ่น, สตริง qName, คุณลักษณะแอตทริบิวต์) พ่น SAXException {
ถ้า (qName.equalsIgnoreCase("รายการ") && คุณลักษณะ getLength() > 0) {
ถ้า (currentConfigSection.equalsIgnoreCase ("SysConfigItem")) {
sysConfig = SysConfigItem ใหม่ (แอตทริบิวต์);
} อื่นถ้า (currentConfigSection.equalsIgnoreCase("InterfaceConfigItems")) {
interfaceConfigList.add (InterfaceConfigItem ใหม่ (แอตทริบิวต์));
} อื่นถ้า (currentConfigSection.equalsIgnoreCase("FtpConfigItems")) {
ftpConfigList.add (FtpConfigItem ใหม่ (แอตทริบิวต์));
} อื่นถ้า (currentConfigSection.equalsIgnoreCase("AdapterConfigItems")) {
adapterConfigList.add (AdapterConfigItem ใหม่ (แอตทริบิวต์));
-
} อื่น {
currentConfigSection = qName;
-
-
โมฆะสาธารณะ endElement (String uri, String localName, String qName) พ่น SAXException {
-
อักขระโมฆะสาธารณะ (ถ่าน ch [], int start, int length) พ่น SAXException {
-
-
คัดลอกรหัสรหัส ดังต่อไปนี้:
นำเข้า java.lang.reflect.Field;
นำเข้า java.text.DateFormat;
นำเข้า java.text.ParseException;
นำเข้า java.text.SimpleDateFormat;
นำเข้า java.util.Date;
นำเข้า org.xml.sax.Attributes;
ConfigItemBase คลาสสาธารณะ {
DateFormat แบบคงที่ส่วนตัว dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ConfigItemBase สาธารณะ () {
-
-
* ปัจจุบันรองรับประเภททั่วไปเพียงไม่กี่ประเภทเท่านั้น หากคุณต้องการรองรับประเภทอื่น โปรดแก้ไขโค้ดที่นี่
-
* แอตทริบิวต์ @param
-
ConfigItemBase สาธารณะ (แอตทริบิวต์แอตทริบิวต์) {
คลาส<?> cls = this.getClass();
ฟิลด์ [] = cls.getDeclaredFields();
สำหรับ (ฟิลด์ ฟิลด์ : ฟิลด์) {
สตริง fieldType = field.getType().getSimpleName();
สำหรับ (int i = 0; i <attributes.getLength(); i++) {
ถ้า (attributes.getQName(i).equalsIgnoreCase(field.getName())) {
field.setAccessible(จริง);
พยายาม {
ถ้า (fieldType.equalsIgnoreCase ("สตริง")) {
field.set(นี่,attributes.getValue(attributes.getQName(i)));
} อื่นถ้า (fieldType.equalsIgnoreCase("จำนวนเต็ม")) {
field.set(นี่, Integer.valueOf(attributes.getValue(attributes.getQName(i))));
} อื่นถ้า (fieldType.equalsIgnoreCase("Double")) {
field.set(นี่, Double.valueOf(attributes.getValue(attributes.getQName(i))));
} อื่นถ้า (fieldType.equalsIgnoreCase("วันที่")) {
field.set(นี้, GetDate(attributes.getValue(attributes.getQName(i))));
} อื่น {
System.out.println("คำเตือน:ฟิลด์ Unhandler(" + field.getName() + "-" + fieldType + ")");
-
} จับ (IllegalArgumentException e) {
e.printStackTrace();
} จับ (IllegalAccessException e) {
e.printStackTrace();
-
หยุดพัก;
-
-
-
-
สตริงสาธารณะ toString() {
ผลลัพธ์สตริง = "";
คลาส<?> cls = this.getClass();
สตริง classNameString = cls.getName();
ผลลัพธ์ += classNameString.substring(classNameString.lastIndexOf('.') + 1, classNameString.length()) + ///;
ฟิลด์ [] = cls.getDeclaredFields();
สำหรับ (ฟิลด์ ฟิลด์ : ฟิลด์) {
พยายาม {
ผลลัพธ์ += field.getName() + "=" + field.get(this) + ";";
} จับ (IllegalArgumentException e) {
e.printStackTrace();
} จับ (IllegalAccessException e) {
e.printStackTrace();
-
-
ส่งคืนผลลัพธ์;
-
-
* แอ็ตทริบิวต์ประเภทเวลาประมวลผล (ข้อกำหนดรูปแบบเวลาคือ: yyyy-MM-dd hh:mm:ss)
-
* @param dateString
* @กลับ
-
GetDate วันที่คงที่ส่วนตัว (String dateString) {
วันที่วันที่ = null;
พยายาม {
วันที่ = dateFormat.parse (dateString);
} จับ (ParseException e) {
e.printStackTrace();
-
วันที่เดินทางกลับ;
-
-
ต่อไปนี้มุ่งเน้นไปที่สิ่งที่สะดวกที่สุด: JAXB (สถาปัตยกรรม Java สำหรับการเชื่อม XML)
ที่นี่เราใช้อินเทอร์เฟซ XML BatchSyncOrderRelationReq บนมือถือที่ซับซ้อนมากขึ้นเป็นตัวอย่าง (ฉันรู้สึกว่าทุกคนที่สามารถเข้าใจสิ่งนี้โดยพื้นฐานแล้วก็เพียงพอแล้ว) รูปแบบข้อความจะเป็นดังนี้ (เนื้อหา CDATA ใน SvcCont คือเนื้อหาข้อความซึ่งน่าขยะแขยง):
คัดลอกรหัสรหัส ดังต่อไปนี้:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<อินเตอร์บอส>
<เวอร์ชัน>0100</เวอร์ชัน>
<TestFlag>0</TestFlag>
<ชนิด BIP>
<BIPCode>BIP2B518</BIPCode>
<รหัสกิจกรรม>T2101518</รหัสกิจกรรม>
<แอคชั่นโค้ด>0</แอคชั่นโค้ด>
</ชนิด BIP>
<ข้อมูลเส้นทาง>
<OrigDomain>บอส</OrigDomain>
<ประเภทเส้นทาง>ประเภทเส้นทาง</ประเภทเส้นทาง>
<การกำหนดเส้นทาง>
<โฮมโดเมน>XXXX</โฮมโดเมน>
<RouteValue>ค่าเส้นทาง</RouteValue>
</การกำหนดเส้นทาง>
</ข้อมูลเส้นทาง>
<ทรานส์อินโฟ>
<รหัสเซสชัน>2013041017222313925676</รหัสเซสชัน>
<TransIDO>2013041017222313925676</TransIDO>
<TransIDOTime>20130410172223</TransIDOTime>
<ทรานส์IDH></ทรานส์IDH>
<TransIDHTime></TransIDHTime>
</ทรานส์อินโฟ>
<SNReserve>
<ทรานส์ไอดีซี></ทรานส์ไอดีซี>
<Convidd></Convid>
<วันตัดออก</ตัดวัน>
<OSNTime></OSNTime>
<OSNDUNS></OSNDUNS>
<HSNDUNS></HSNDUNS>
<MsgSender></MsgSender>
<MsgReceiver></MsgReceiver>
<ลำดับความสำคัญ></ลำดับความสำคัญ>
<ระดับการบริการ></ระดับการบริการ>
<SvcContType></SvcContType>
</SNReserve>
<การตอบสนอง>
<RspType>rspType</RspType>
<RspCode>rspCode</RspCode>
<RspDesc>rspDesc</RspDesc>
</การตอบสนอง>
<SvcCont><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<batchSyncOrderRelationReq>
<msgTransactionID>210001BIP2B518130410172223651627</msgTransactionID>
<reqNum>2</reqNum>
<ร่างกายที่ต้องการ>
<oprNumb>210001BIP2B518130410172224341871</oprNumb>
<ข้อมูลการสมัครสมาชิก>
<oprTime>oprTime1</oprTime>
<actionID>actionId1</actionID>
<แบรนด์>แบรนด์1</แบรนด์>
<effTime>effTime1</effTime>
<expireTime>หมดอายุTime1</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>
</ข้อมูลการสมัครสมาชิก>
</reqBody>
<ร่างกายที่ต้องการ>
<oprNumb>210001BIP2B518130410172224420909</oprNumb>
<ข้อมูลการสมัครสมาชิก>
<oprTime>oprTime2</oprTime>
<actionID>actionId2</actionID>
<แบรนด์>แบรนด์2</แบรนด์>
<effTime>effTime2</effTime>
<หมดอายุTime>หมดอายุTime2</หมดอายุTime>
<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>
</ข้อมูลการสมัครสมาชิก>
</reqBody>
</batchSyncOrderRelationReq>]]></SvcCont>
</อินเตอร์บอส>
รหัสถอดรหัสมีดังนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
@XmlRootElement(name = "batchSyncOrderRelationReq")
@XmlAccessorType(XmlAccessType.FIELD)
คลาสสาธารณะ BatchSyncOrderRelationReq ขยาย BossMessage <BatchSyncOrderRelationReq> {
@XmlElement(ชื่อ = "msgTransactionID")
สตริงส่วนตัว msgTransactionId = "";
@XmlElement(ชื่อ = "reqNum")
สตริงส่วนตัว reqNum = "";
@XmlElement(name = "reqBody")
รายการส่วนตัว <BatchSyncOrderRelationReqBody> reqBodyList;
BatchSyncOrderRelationReq สาธารณะ () {
-
สตริงสาธารณะ getMsgTransactionId() {
กลับ this.msgTransactionId;
-
โมฆะสาธารณะ setMsgTransactionId (สตริง msgTransactionId) {
this.msgTransactionId = msgTransactionId;
-
สตริงสาธารณะ getReqNum() {
ส่งคืน this.reqNum;
-
โมฆะสาธารณะ setReqNum (สตริง reqNum) {
this.reqNum = reqNum;
-
รายการสาธารณะ <BatchSyncOrderRelationReqBody> getReqBodyList() {
ส่งคืน this.reqBodyList;
-
โมฆะสาธารณะ setReqBodyList (รายการ <BatchSyncOrderRelationReqBody> reqBodyList) {
this.reqBodyList = reqBodyList;
-
@แทนที่
BatchSyncOrderRelationReq Deserialized สาธารณะ (String interBossXmlContent) พ่น BusinessException {
พยายาม {
//ดีซีเรียลไลซ์สำหรับหัว
JAXBContext jaxbCxt4Head = JAXBContext.newInstance(MessageHead.class);
Unmarshaller unmarshaller4Head = jaxbCxt4Head.createUnmarshaller();
MessageHead head = (MessageHead) unmarshaller4Head.unmarshal (StringReader ใหม่ (interBossXmlContent));
// ดีซีเรียลไลซ์สำหรับเนื้อหา SyncOrderRelationReq
JAXBContext jaxbCxt4Body = JAXBContext.newInstance(BatchSyncOrderRelationReq.class);
Unmarshaller unmarshaller4Body = jaxbCxt4Body.createUnmarshaller();
BatchSyncOrderRelationReq BatSyncOrderRelationReq = (BatchSyncOrderRelationReq) unmarshaller4Body.unmarshal(new StringReader(head.getSvcCont().trim()));
atchSyncOrderRelationReq.setHead(หัว);
ส่งคืนแบตช์SyncOrderRelationReq;
} จับ (JAXBException จ) {
โยน BusinessException ใหม่ ("ข้อผิดพลาด SyncOrderRelationReq.Deserialized ()! (" + interBossXmlContent + ")", e);
-
-
-
@XmlAccessorType(XmlAccessType.FIELD)
คัดลอกรหัสรหัส ดังต่อไปนี้:
คลาสสาธารณะ BatchSyncOrderRelationReqBody {
@XmlElement(ชื่อ = "oprNumb")
สตริงส่วนตัว oprNumb = "";
@XmlElement(name = "ข้อมูลการสมัครสมาชิก")
ข้อมูลการสมัครสมาชิกส่วนตัว ข้อมูลการสมัครสมาชิก;
BatchSyncOrderRelationReqBody สาธารณะ () {
-
BatchSyncOrderRelationReqBody สาธารณะ (สตริง oprNumb, SubscriptionInfo SubscriptionInfo) {
this.oprNumb = oprNumb;
this.subscriptionInfo = การสมัครสมาชิกข้อมูล;
-
สตริงสาธารณะ getOprNumb() {
กลับ this.oprNumb;
-
โมฆะสาธารณะ setOprNumb (สตริง oprNumb) {
this.oprNumb = oprNumb;
-
ข้อมูลการสมัครสมาชิกสาธารณะ getSubscriptionInfo () {
ส่งคืน this.subscriptionInfo;
-
โมฆะสาธารณะ setSubscriptionInfo (SubscriptionInfo SubscribeInfo) {
this.subscriptionInfo = การสมัครสมาชิกข้อมูล;
-
-
@XmlAccessorType(XmlAccessType.FIELD)
คัดลอกรหัสรหัส ดังต่อไปนี้:
ข้อมูลการสมัครสมาชิกคลาสสาธารณะ {
@XmlElement(name = "oprTime")
สตริงส่วนตัว oprTime = "";
@XmlElement(ชื่อ = "actionID")
สตริงส่วนตัว actionId = "";
@XmlElement(ชื่อ = "แบรนด์")
แบรนด์สตริงส่วนตัว = "";
@XmlElement(name = "effTime")
สตริงส่วนตัว effTime = "";
@XmlElement(name = "หมดอายุเวลา")
สตริงส่วนตัวหมดอายุเวลา = "";
@XmlElement(name = "feeUser_ID")
ส่วนตัว String feeUserId = "";
@XmlElement(ชื่อ = "destUser_ID")
สตริงส่วนตัว destUserId = "";
@XmlElement(ชื่อ = "actionReasonID")
สตริงส่วนตัว actionReasonId = "";
@XmlElement(name = "servType")
สตริงส่วนตัว servType = "";
@XmlElement(name = "subServType")
สตริงส่วนตัว subServType = "";
@XmlElement(ชื่อ = "SPID")
สตริงส่วนตัว spId = "";
@XmlElement(ชื่อ = "SPServID")
สตริงส่วนตัว spServId = "";
@XmlElement(name = "โหมดการเข้าถึง")
accessMode สตริงส่วนตัว = "";
@XmlElement(name = "ประเภทค่าธรรมเนียม")
ค่าสตริงส่วนตัว = "";
ข้อมูลการสมัครสมาชิกสาธารณะ () {
-
ข้อมูลการสมัครสมาชิกสาธารณะ (
สตริง oprTime
รหัสการกระทำของสตริง
แบรนด์สตริง,
สตริง effTime
สตริงหมดอายุเวลา
ค่าธรรมเนียมสตริง UserId,
สตริง deestUserId
สตริง actionReasonId
สตริง servType
สตริง subServType
สตริง spId,
สตริง spServId,
โหมดการเข้าถึงสตริง
ประเภทค่าธรรมเนียมสตริง) {
this.oprTime = oprTime;
this.actionId = รหัสการกระทำ;
this.brand = แบรนด์;
this.effTime = effTime;
this.expireTime = expireTime;
this.feeUserId = ค่าธรรมเนียม UserId;
this.destUserId = destUserId;
this.actionReasonId = actionReasonId;
this.servType = ประเภทเซิร์ฟ;
this.subServType = ประเภทย่อย;
นี้.spId = spId;
นี้.spServId = spServId;
this.accessMode = โหมดการเข้าถึง;
this.feeType = ประเภทค่าธรรมเนียม;
-
สตริงสาธารณะ getOprTime() {
กลับ this.oprTime;
-
โมฆะสาธารณะ setOprTime (สตริง oprTime) {
this.oprTime = oprTime;
-
สตริงสาธารณะ getActionId() {
ส่งคืน this.actionId;
-
โมฆะสาธารณะ setActionId (สตริง actionId) {
this.actionId = รหัสการกระทำ;
-
สตริงสาธารณะ getBrand() {
ส่งคืน this.brand;
-
โมฆะสาธารณะ setBrand (แบรนด์สตริง) {
this.brand = แบรนด์;
-
สตริงสาธารณะ getEffTime() {
ส่งคืน this.effTime;
-
โมฆะสาธารณะ setEffTime (String effTime) {
this.effTime = effTime;
-
สตริงสาธารณะ getExpireTime() {
ส่งคืน this.expireTime;
-
โมฆะสาธารณะ setExpireTime (สตริงหมดอายุเวลา) {
this.expireTime = expireTime;
-
สตริงสาธารณะ getFeeUserId() {
ส่งคืน this.feeUserId;
-
โมฆะสาธารณะ setFeeUserId (ค่าธรรมเนียมสตริง UserId) {
this.feeUserId = ค่าธรรมเนียม UserId;
-
สตริงสาธารณะ getDestUserId() {
กลับ this.destUserId;
-
โมฆะสาธารณะ setDestUserId (สตริง destUserId) {
this.destUserId = destUserId;
-
สตริงสาธารณะ getActionReasonId() {
ส่งคืน this.actionReasonId;
-
โมฆะสาธารณะ setActionReasonId (สตริง actionReasonId) {
this.actionReasonId = actionReasonId;
-
สตริงสาธารณะ getServType() {
ส่งคืน this.servType;
-
โมฆะสาธารณะ setServType (String servType) {
this.servType = ประเภทเซิร์ฟ;
-
สตริงสาธารณะ getSubServType() {
ส่งคืน this.subServType;
-
โมฆะสาธารณะ setSubServType (String subServType) {
this.subServType = ประเภทย่อย;
-
สตริงสาธารณะ getSpId() {
ส่งคืน this.spId;
-
โมฆะสาธารณะ setSpId (สตริง spId) {
นี้.spId = spId;
-
สตริงสาธารณะ getSpServId() {
ส่งคืน this.spServId;
-
โมฆะสาธารณะ setSpServId (สตริง spServId) {
นี้.spServId = spServId;
-
สตริงสาธารณะ getAccessMode() {
กลับ this.accessMode;
-
โมฆะสาธารณะ setAccessMode (โหมดการเข้าถึงสตริง) {
this.accessMode = โหมดการเข้าถึง;
-
สตริงสาธารณะ getFeeType() {
ส่งคืน this.feeType;
-
โมฆะสาธารณะ setFeeType (ประเภทค่าธรรมเนียมสตริง) {
this.feeType = ประเภทค่าธรรมเนียม;
-
-