دعونا نتحدث بإيجاز عن الطرق الثلاثة الأولى:
طريقة DOM: أنا شخصياً أفهم أن XmlDocument المشابه لـ .net ليس فعالاً عند التحليل، ويستهلك الذاكرة، وغير مناسب لتحليل XML الكبير؛
طريقة SAX: التحليل المستند إلى الحدث، عندما يتم تحليل جزء معين من ملف XML، سيتم تشغيل حدث معين، ويمكنك تحديد ما يجب فعله عند تشغيل الحدث في فئة تحليل مخصصة الطريقة، وأتساءل عما إذا كان هناك طريقة مماثلة في ظل نظام .Net؟
طريقة StAX: أنا شخصياً أفهم أنها مشابهة لطريقة XmlReader الخاصة بـ .net، وهي فعالة للغاية، وتستهلك ذاكرة أقل، ومناسبة لتحليل ملفات XML الكبيرة؛
ومع ذلك، تم استخدام طريقة SAX من قبل. تقدم هذه المقالة بشكل أساسي JAXB ويتم نشر الكود الرئيسي هنا:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
الطبقة العامة ConfigParser تمتد DefaultHandler {
قسم التكوين الحالي الخاص بالسلسلة ؛
عام SysConfigItem sysConfig؛
القائمة العامة<InterfaceConfigItem> واجهةConfigList;
القائمة العامة<FtpConfigItem> ftpConfigList;
القائمة العامة<AdapterConfigItem> محولConfigList;
public void startDocument() يلقي SAXException {
sysConfig = new SysConfigItem();
InterfaceConfigList = new ArrayList<InterfaceConfigItem>();
ftpConfigList = new ArrayList<FtpConfigItem>();
adapterConfigList = new ArrayList<AdapterConfigItem>();
}
endDocument () الفراغ العام يطرح SAXException {
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
إذا (qName.equalsIgnoreCase("Item") && attributes.getLength() > 0) {
إذا (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")) {
محولConfigList.add(new AdapterConfigItem(attributes));
}
} آخر {
currentConfigSection = qName;
}
}
endElement الفراغ العام (String uri، String localName، String qName) يلقي SAXException {
}
أحرف باطلة عامة (char ch[]، int start، int length) تطرح SAXException {
}
}
import org.xml.sax.Attributes;
الطبقة العامة ConfigItemBase {
DateFormat الخاص الثابت dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
قاعدة التكوين العامة () {
}
/**
* لا يتم حاليًا دعم سوى عدد قليل من الأنواع الشائعة. إذا كنت بحاجة إلى دعم أنواع أخرى، فيرجى تعديل الكود هنا.
*
* سماتparam
*/
عام ConfigItemBase(سمات السمات) {
Class<?> cls = this.getClass();
الحقل[] الحقول = cls.getDeclaredFields();
لـ (حقل الحقل: الحقول) {
String fieldType = field.getType().getSimpleName();
for (int i = 0; i < attributes.getLength(); i++) {
إذا (attributes.getQName(i).equalsIgnoreCase(field.getName())) {
field.setAccessible(true);
يحاول {
إذا (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("التاريخ")) {
field.set(this, GetDate(attributes.getValue(attributes.getQName(i))));
} آخر {
System.out.println("تحذير: حقل Unhandler(" + field.getName() + "-" + fieldType + ")");
}
} قبض على (IllegalArgumentException e) {
printStackTrace();
} قبض على (IllegalAccessException e) {
printStackTrace();
}
استراحة؛
}
}
}
}
سلسلة عامة إلى سلسلة () {
نتيجة السلسلة = ""؛
Class<?> cls = this.getClass();
String classNameString = cls.getName();
result += classNameString.substring(classNameString.lastIndexOf('.') + 1, classNameString.length()) + ":;
الحقل[] الحقول = cls.getDeclaredFields();
لـ (حقل الحقل: الحقول) {
يحاول {
result += field.getName() + "=" + field.get(this) + ";";
} قبض على (IllegalArgumentException e) {
printStackTrace();
} قبض على (IllegalAccessException e) {
printStackTrace();
}
}
نتيجة الإرجاع؛
}
/**
* سمات نوع وقت العملية (متطلبات تنسيق الوقت هي: yyyy-MM-dd hh:mm:ss)
*
* @param dateString
* @يعود
*/
تاريخ ثابت خاص GetDate(String dateString) {
تاريخ التاريخ = فارغ؛
يحاول {
date = dateFormat.parse(dateString);
} قبض (ParseException ه) {
printStackTrace();
}
تاريخ العودة؛
}
}
@XmlElement(name = "msgTransactionID")
سلسلة خاصة msgTransactionId = "";
@XmlElement(الاسم = "reqNum")
سلسلة خاصة reqNum = "";
@XmlElement(الاسم = "reqBody")
قائمة خاصة <BatchSyncOrderRelationReqBody> reqBodyList؛
عام BatchSyncOrderRelationReq() {
}
سلسلة عامة getMsgTransactionId() {
إرجاع this.msgTransactionId؛
}
مجموعة الفراغ العامMsgTransactionId(String msgTransactionId) {
this.msgTransactionId = msgTransactionId;
}
سلسلة عامة getReqNum() {
إرجاع هذا.reqNum;
}
مجموعة الفراغ العامة (سلسلة reqNum) {
this.reqNum = reqNum;
}
القائمة العامة<BatchSyncOrderRelationReqBody> getReqBodyList() {
إرجاع this.reqBodyList;
}
public void setReqBodyList(List<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(new StringReader(interBossXmlContent));
// تم إلغاء التسلسل لجسم SyncOrderRelationReq
JAXBContext jaxbCxt4Body = JAXBContext.newInstance(BatchSyncOrderRelationReq.class);
Unmarshaller unmarshaller4Body = jaxbCxt4Body.createUnmarshaller();
BatchSyncOrderRelationReq BatchSyncOrderRelationReq = (BatchSyncOrderRelationReq) unmarshaller4Body.unmarshal(new StringReader(head.getSvcCont().trim()));
BatchSyncOrderRelationReq.setHead(head);
إرجاع BatchSyncOrderRelationReq;
} قبض (JAXBException ه) {
throw new BusinessException("خطأ SyncOrderRelationReq.Deserialized()!(" + interBossXmlContent + ")"، e);
}
}
}
@XmlElement(الاسم = "oprNumb")
سلسلة خاصة oprNumb = "";
@XmlElement(الاسم = "معلومات الاشتراك")
معلومات الاشتراك الخاصة معلومات الاشتراك؛
عام BatchSyncOrderRelationReqBody(){
}
عام BatchSyncOrderRelationReqBody(String oprNumb, SubscriptionInfoاشتراكInfo) {
this.oprNumb = oprNumb;
this.subscriptionInfo =scriptionInfo;
}
سلسلة عامة getOprNumb() {
إرجاع this.oprNumb;
}
مجموعة الفراغ العامOprNumb(سلسلة oprNumb) {
this.oprNumb = oprNumb;
}
معلومات الاشتراك العامة getSubscriptionInfo() {
إرجاع this.subscriptionInfo;
}
مجموعة باطلة عامةSubscriptionInfo(SubscriptionInfoاشتراكInfo) {
this.subscriptionInfo =scriptionInfo;
}
}
@XmlElement(الاسم = "oprTime")
سلسلة خاصة oprTime = "";
@XmlElement(الاسم = "معرف الإجراء")
معرف سلسلة خاصة = ""؛
@XmlElement(الاسم = "العلامة التجارية")
العلامة التجارية الخاصة بسلسلة = "";
@XmlElement(الاسم = "effTime")
سلسلة خاصة effTime = "";
@XmlElement(الاسم = "expireTime")
سلسلة خاصة تنتهي وقتها = "";
@XmlElement(name = "feeUser_ID")
رسوم سلسلة خاصةUserId = ""؛
@XmlElement(name = "destUser_ID")
سلسلة خاصة destUserId = "";
@XmlElement(name = "actionReasonID")
سلسلة خاصة actionReasonId = "";
@XmlElement(الاسم = "servType")
سلسلة خاصة servType = "";
@XmlElement(name = "subServType")
سلسلة خاصة subServType = "";
@XmlElement(الاسم = "SPID")
سلسلة خاصة spId = "";
@XmlElement(الاسم = "SPServID")
سلسلة خاصة spServId = "";
@XmlElement(name = "accessMode")
وضع الوصول الخاص بالسلسلة = "";
@XmlElement(الاسم = "feeType")
رسوم السلسلة الخاصة = ""؛
معلومات الاشتراك العامة () {
}
معلومات الاشتراك العامة(
سلسلة oprTime,
معرف إجراء السلسلة،
العلامة التجارية سلسلة,
سلسلة effTime,
وقت انتهاء صلاحية السلسلة،
معرف مستخدم رسوم السلسلة ،
سلسلة destUserId،
سلسلة ActionReasonId،
نوع خادم السلسلة،
سلسلة فرعيةنوع الخدمة,
معرف السلسلة،
سلسلة spServId،
وضع الوصول إلى السلسلة،
نوع رسوم السلسلة) {
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;
}
سلسلة عامة getOprTime() {
إرجاع this.oprTime;
}
مجموعة الفراغ العام (سلسلة oprTime) {
this.oprTime = oprTime;
}
سلسلة عامة getActionId () {
إرجاع this.actionId;
}
مجموعة باطلة عامة (سلسلة عمل معرف) {
this.actionId = actionId;
}
سلسلة عامة getBrand () {
إرجاع this.brand;
}
مجموعة الفراغ العام (سلسلة العلامة التجارية) {
this.brand = Brand;
}
سلسلة عامة getEffTime() {
return this.effTime;
}
مجموعة الفراغ العام (سلسلة effTime) {
this.effTime = effTime;
}
سلسلة عامة getExpireTime () {
إرجاع this.expireTime;
}
مجموعة الفراغ العام ExpireTime (سلسلة ExpireTime) {
this.expireTime =expireTime;
}
سلسلة عامة getFeeUserId() {
إرجاع this.feeUserId;
}
public void setFeeUserId(StringfeeUserId) {
this.feeUserId =feeUserId;
}
السلسلة العامة getDestUserId() {
إرجاع this.destUserId;
}
مجموعة الفراغ العام DestUserId (سلسلة destUserId) {
this.destUserId = destUserId;
}
سلسلة عامة getActionReasonId() {
إرجاع this.actionReasonId;
}
مجموعة الفراغ العام ActionReasonId (سلسلة actionReasonId) {
this.actionReasonId = actionReasonId;
}
سلسلة عامة getServType () {
إرجاع this.servType;
}
مجموعة الفراغ العام ServType (سلسلة servType) {
this.servType = servType;
}
سلسلة عامة getSubServType () {
إرجاع this.subServType;
}
مجموعة باطلة عامةSubServType(سلسلة subServType) {
this.subServType = subServType;
}
سلسلة عامة getSpId () {
إرجاع this.spId;
}
مجموعة الفراغ العام (سلسلة spId) {
this.spId = spId;
}
سلسلة عامة getSpServId () {
إرجاع this.spServId;
}
مجموعة الفراغ العامSpServId(سلسلة spServId) {
this.spServId = spServId;
}
سلسلة عامة getAccessMode () {
إرجاع this.accessMode؛
}
مجموعة الوصول العامة باطلة (سلسلة الوصول) {
this.accessMode = accessMode;
}
سلسلة عامة getFeeType () {
إرجاع this.feeType;
}
مجموعة الفراغ العام (نوع السلسلة) {
this.feeType =feeType;
}
}