دعونا نتحدث بإيجاز عن الطرق الثلاثة الأولى:
طريقة DOM : أنا شخصيًا أفهم أن XmlDocument المشابه لـ .net ليس فعالاً عند التحليل، ويستهلك الذاكرة، وغير مناسب لتحليل XML الكبير؛
طريقة SAX : التحليل المستند إلى الحدث، عند تحليل جزء معين من ملف XML، سيتم تشغيل حدث معين، ويمكنك تحديد ما يجب فعله عند تشغيل الحدث في فئة تحليل مخصصة، وأعتقد شخصيًا أن هذا بديل جدًا الطريقة، وأتساءل عما إذا كان هناك طريقة مماثلة في ظل نظام .Net؟
طريقة StAX : أنا شخصياً أفهم أنها مشابهة لطريقة XmlReader الخاصة بـ .net، وهي فعالة للغاية، وتستهلك ذاكرة أقل، ومناسبة لتحليل ملفات 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;
الطبقة العامة 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 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;
الطبقة العامة 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();
}
تاريخ العودة؛
}
}
يركز ما يلي على الأكثر ملاءمة: JAXB (هندسة Java لربط XML)
نستخدم هنا واجهة XML الأكثر تعقيدًا للهاتف المحمول BatchSyncOrderRelationReq كمثال (أشعر أن كل من يمكنه فهم هذا يكفي بشكل أساسي)، تنسيق الرسالة كما يلي (محتوى CDATA في SvcCont هو نص الرسالة، وهو أمر مثير للاشمئزاز):
انسخ رمز الكود كما يلي:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<إنتربوس>
<الإصدار>0100</الإصدار>
<TestFlag>0</TestFlag>
<نوع بيبتي>
<BIPCode>BIP2B518</BIPCode>
<ActivityCode>T2101518</ActivityCode>
<ActionCode>0</ActionCode>
</BIPType>
<معلومات التوجيه>
<OrigDomain>BOSS</OrigDomain>
<RouteType>routeType</RouteType>
<التوجيه>
<HomeDomain>XXXX</HomeDomain>
<RouteValue>routeValue</RouteValue>
</التوجيه>
</معلومات التوجيه>
<ترانس إنفو>
<SessionID>2013041017222313925676</SessionID>
<TransIDO>2013041017222313925676</TransIDO>
<TransIDOTime>20130410172223</TransIDOTime>
<TransIDH></TransIDH>
<TransIDHTime></TransIDHTime>
</ترانس إنفو>
<SNReserve>
<ترانسيدك></ترانسيدك>
<ConvID></ConvID>
<CutOffDay></CutOffDay>
<أو إس إن تايم></أو إس إن تايم>
<OSNDUNS></OSNDUNS>
<HSNDUNS></HSNDUNS>
<MsgSender></MsgSender>
<مسجريسيفير></مسجريسيفير>
<الأولوية></الأولوية>
<مستوى الخدمة></مستوى الخدمة>
<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>
<reqBody>
<oprNumb>210001BIP2B518130410172224341871</oprNumb>
<معلومات الاشتراك>
<oprTime>oprTime1</oprTime>
<actionID>actionId1</actionID>
<العلامة التجارية>العلامة التجارية1</العلامة التجارية>
<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>
<سيرفبارامينفو>
<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>
<معلومات الاشتراك>
<oprTime>oprTime2</oprTime>
<actionID>actionId2</actionID>
<العلامة التجارية>العلامة التجارية2</العلامة التجارية>
<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>
<سيرفبارامينفو>
<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>
</إنتربوس>
رمز فك التشفير هو كما يلي:
انسخ رمز الكود كما يلي:
@XmlRootElement(name = "batchSyncOrderRelationReq")
@XmlAccessorType(XmlAccessType.FIELD)
الطبقة العامة BatchSyncOrderRelationReq تمتد BossMessage<BatchSyncOrderRelationReq> {
@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);
}
}
}
@XmlAccessorType(XmlAccessType.FIELD)
انسخ رمز الكود كما يلي:
الطبقة العامة BatchSyncOrderRelationReqBody {
@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;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
انسخ رمز الكود كما يلي:
معلومات الاشتراك في الفئة العامة {
@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;
}
}