มาพูดคุยสั้น ๆ เกี่ยวกับสามวิธีแรก:
วิธี DOM: โดยส่วนตัวแล้วฉันเข้าใจดีว่า XmlDocument ที่คล้ายกับ .net นั้นไม่ได้มีประสิทธิภาพในการแยกวิเคราะห์ ใช้หน่วยความจำ และไม่เหมาะสำหรับการแยกวิเคราะห์ XML ขนาดใหญ่
วิธี SAX: การแยกวิเคราะห์ตามเหตุการณ์ เมื่อบางส่วนของ xml ถูกแยกวิเคราะห์ เหตุการณ์เฉพาะจะถูกทริกเกอร์ คุณสามารถกำหนดสิ่งที่ต้องทำเมื่อเหตุการณ์ถูกทริกเกอร์ในคลาสการแยกวิเคราะห์แบบกำหนดเอง โดยส่วนตัวแล้วฉันรู้สึกว่ามันเป็นทางเลือกหนึ่ง ทาง ฉันสงสัยว่ามีวิธีที่คล้ายกันภายใต้ระบบ .Net หรือไม่?
วิธี StAX: โดยส่วนตัวแล้วฉันเข้าใจว่ามันคล้ายกับวิธี XmlReader ของ .net ซึ่งมีประสิทธิภาพสูง ใช้หน่วยความจำน้อยกว่า และเหมาะสำหรับการแยกวิเคราะห์ XML ขนาดใหญ่
อย่างไรก็ตาม ก่อนหน้านี้มีการใช้วิธี SAX บทความนี้จะแนะนำ JAXB เป็นหลักเท่านั้น
นำเข้า 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 {
-
-
นำเข้า 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();
-
วันที่เดินทางกลับ;
-
-
@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);
-
-
-
@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 = การสมัครสมาชิกข้อมูล;
-
-
@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 = ประเภทค่าธรรมเนียม;
-
-