كما نعلم جميعًا ، هناك المزيد والمزيد من الطرق لتحليل XML الآن ، ولكن لا يوجد سوى أربع طرق سائدة ، وهي: DOM و SAX و JDOM و DOM4J
فيما يلي أول من يعطي عنوان تنزيل حزمة JAR لهذه الطرق الأربع
DOM: إنه يأتي في حزمة Java JDK الحالية ، في حزمة XML-Apis.jar
ساكس: http://sourceforge.net/projects/sax/
JDOM: http://jdom.org/downloads/index.html
DOM4J: http://sourceforge.net/projects/dom4j/
1. مقدمة وتحليل المزايا والعيوب
1. DOM (نموذج كائن المستند)
DOM هو معيار W3C الرسمي لتمثيل مستندات XML بطريقة مستقلة عن النظام الأساسي واللغة. DOM هي مجموعة من العقد أو شظايا المعلومات المنظمة في التسلسل الهرمي. يتيح هذا التسلسل الهرمي للمطورين البحث عن معلومات محددة في الشجرة. يتطلب تحليل هذا الهيكل عادة تحميل المستند بأكمله وبناء التسلسل الهرمي قبل القيام بأي عمل. نظرًا لأنه يعتمد على مستوى المعلومات ، فإن DOM تعتبر قائمة على الأشجار أو قائمة على الكائن.
【ميزة】
① السماح للتطبيقات بإجراء تغييرات على البيانات والبنية.
② الوصول ثنائي الاتجاه ، ويمكنك التنقل لأعلى ولأسفل الشجرة في أي وقت ، والحصول على أي جزء من البيانات وتشغيلها.
【عيب】
① عادة ، يجب تحميل مستند XML بالكامل لإنشاء التسلسل الهرمي ، الذي يستهلك الكثير من الموارد.
2. ساكس (API بسيط لـ XML)
مزايا معالجة SAX تشبه إلى حد كبير مزايا البث. يمكن أن يبدأ التحليل على الفور ، بدلاً من انتظار معالجة جميع البيانات. وبما أن التطبيق لا يتحقق إلا من البيانات عند قراءتها ، فلا يحتاج إلى تخزين البيانات في الذاكرة. هذه ميزة كبيرة للوثائق الكبيرة. في الواقع ، لا يتعين على التطبيق تحليل المستند بأكمله ؛ يمكن أن يتوقف عن التحليل عند استيفاء حالة معينة. بشكل عام ، SAX أسرع بكثير من استبدال DOM.
اختر دوم أو ساكس؟ بالنسبة للمطورين الذين يحتاجون إلى كتابة التعليمات البرمجية الخاصة بهم لمعالجة مستندات XML ، فإن اختيار نموذج تحليل DOM أو SAX هو قرار تصميم مهم للغاية. يستخدم DOM طريقة إنشاء بنية شجرة للوصول إلى مستندات XML ، بينما يستخدم SAX نموذج حدث.
يحول محلل DOM مستند XML إلى شجرة تحتوي على محتوياتها ويمكن أن يعبر الشجرة. ميزة تحليل النموذج مع DOM هي أنه من السهل البرمجة. يحتاج المطورون فقط إلى استدعاء تعليمات صنع الأشجار ثم استخدام واجهات برمجة تطبيقات التنقل للوصول إلى عقد الأشجار المطلوبة لإكمال المهمة. من السهل إضافة وتعديل العناصر في الشجرة. ومع ذلك ، نظرًا لأن وثيقة XML بأكملها تحتاج إلى معالجة عند استخدام محلل DOM ، فإن متطلبات الأداء والذاكرة مرتفعة نسبيًا ، خاصة عند مواجهة ملفات XML الكبيرة. نظرًا لقدراتها على اجتيازها ، غالبًا ما يتم استخدام محلات DOM في الخدمات حيث تتطلب مستندات XML تغييرات متكررة.
يتبنى محلل ساكس نموذجًا قائمًا على الحدث. يمكن أن يؤدي إلى سلسلة من الأحداث عند تحليل وثيقة XML. عند العثور على علامة معينة ، يمكنها تنشيط طريقة رد الاتصال لمعرفة الطريقة التي تم العثور على العلامة. يتطلب SAX عادةً ذاكرة منخفضة لأنها تتيح للمطورين تحديد العلامات التي يرغبون في معالجتها. خاصة عندما يحتاج المطورون فقط إلى معالجة جزء من البيانات الواردة في المستند ، فإن قدرة توسيع SAX تنعكس بشكل أفضل. ومع ذلك ، يكون الترميز صعبًا عند استخدام SAX Parser ، ومن الصعب الوصول إلى بيانات مختلفة متعددة في نفس المستند في نفس الوقت.
【المزايا】
① ليست هناك حاجة لانتظار معالجة جميع البيانات ويمكن أن يبدأ التحليل على الفور.
② تحقق من البيانات فقط عند قراءة البيانات ، ولا تحتاج إلى حفظها في الذاكرة.
③ يمكنك التوقف عن التحليل عند استيفاء حالة معينة ، دون الحاجة إلى تحليل المستند بأكمله.
④ الكفاءة العالية والأداء ، ويمكنها تحليل المستندات أكبر من ذاكرة النظام.
【عيب】
① يجب أن يكون التطبيق مسؤولاً عن منطق معالجة العلامة (مثل الحفاظ على علاقة الوالد/الطفل ، وما إلى ذلك) ، وكلما زاد تعقيد الوثيقة ، كان البرنامج أكثر تعقيدًا.
② لا يمكن للملاحة أحادية الاتجاه تحديد موقع التسلسل الهرمي للوثيقة ، ومن الصعب الوصول إلى أجزاء مختلفة من بيانات نفس المستند في نفس الوقت ، ولا تدعم XPath.
3. جدوم (نموذج كائن الوثيقة المستند إلى جافا)
الغرض من JDOM هو أن يكون نموذج مستند Java الخاص ، والذي يبسط التفاعل مع XML وهو أسرع من استخدام DOM. نظرًا لأنه أول نموذج خاص بـ Java ، فقد تم ترقيته وترقيته بقوة. بالنظر إلى أنه ينتهي باستخدامه كـ "امتداد قياسي Java" عبر "Java SPECTION request JSR-102". بدأ تطوير JDOM منذ بداية عام 2000.
تختلف JDOM و DOM بشكل أساسي في جانبين. أولاً ، يستخدم JDOM فصول ملموسة فقط وليس واجهات. هذا يبسط واجهة برمجة التطبيقات في بعض النواحي ، ولكن أيضا يحد من المرونة. ثانياً ، تستخدم واجهة برمجة التطبيقات عددًا كبيرًا من فئات المجموعات ، مما يؤدي إلى تبسيط استخدام مطوري Java الذين يعرفون بالفعل هذه الفئات.
تنص وثائق JDOM على أن الغرض منه هو "استخدام 20 ٪ (أو أقل) من الجهد لحل 80 ٪ (أو أكثر) مشاكل JAVA/XML" (يفترض أن 20 ٪ بناءً على منحنى التعلم). يعد JDOM مفيدًا بالطبع لمعظم تطبيقات Java/XML ، ويجد معظم المطورين واجهات برمجة التطبيقات أسهل بكثير من الفهم من DOM. يتضمن JDOM أيضًا فحوصات واسعة للغاية حول سلوك البرنامج لمنع المستخدمين من القيام بأي شيء لا معنى له في XML. ومع ذلك ، لا يزال يتطلب منك فهم XML تمامًا من أجل القيام بشيء ما يتجاوز الأساسيات (أو حتى فهم الأخطاء في بعض الحالات). قد تكون هذه وظيفة أكثر جدوى من تعلم واجهة DOM أو JDOM.
JDOM نفسها لا تحتوي على محلل. عادةً ما يستخدم محلل SAX2 لتحليل وثائق XML الإدخال (على الرغم من أنه يمكن أن يأخذ أيضًا تمثيلات DOM التي تم إنشاؤها مسبقًا كمدخلات). أنه يحتوي على بعض المحولات لإخراج تمثيلات JDOM في تدفقات الأحداث SAX2 أو نماذج DOM أو مستندات نص XML. JDOM مفتوح المصدر الذي تم إصداره ضمن متغير ترخيص Apache.
【ميزة】
① استخدم فئات الخرسانة بدلاً من الواجهات ، وتبسيط API DOM.
② يتم استخدام عدد كبير من فصول جمع Java لتسهيل مطوري Java.
【عيب】
① لا مرونة جيدة.
الأداء الضعيف.
4. DOM4J (نموذج كائن المستند لـ Java)
على الرغم من أن DOM4J يمثل نتيجة تطوير مستقلة تمامًا ، إلا أنه كان في البداية فرعًا ذكيًا من JDOM. إنه يشتمل على العديد من الميزات التي تتجاوز تمثيلات مستندات XML الأساسية ، بما في ذلك دعم XPATH المتكامل ، ودعم مخطط XML ، والمعالجة القائمة على الأحداث للمستندات الكبيرة أو التي يتم بثها. كما يوفر خيار إنشاء تمثيل مستند ، والذي يحتوي على وصول متوازي عبر API DOM4J وواجهة DOM القياسية. لقد كان قيد التطوير منذ النصف الثاني من عام 2000.
لدعم كل هذه الميزات ، يستخدم DOM4J واجهات وطرق الفئة الأساسية التجريدية. يستخدم DOM4J فئة المجموعات في واجهة برمجة التطبيقات على نطاق واسع ، ولكن في كثير من الحالات يوفر أيضًا بعض البدائل للسماح بأداء أفضل أو طريقة ترميز أكثر وضوحًا. الفائدة المباشرة هي أنه على الرغم من أن DOM4J يدفع سعر واجهة برمجة تطبيقات أكثر تعقيدًا ، فإنه يوفر مرونة أكبر بكثير من JDOM.
عند إضافة المرونة ، وتكامل XPath وأهداف معالجة المستندات الكبيرة ، فإن DOM4J هو نفس JDOM: سهولة الاستخدام والتشغيل البديهي لمطوري Java. كما أنه ملتزم أن تصبح حلًا أكثر اكتمالًا من JDOM ، وتحقيق هدف التعامل مع جميع مشاكل Java/XML في الطبيعة. عند الانتهاء من هذا الهدف ، فإنه يؤكد تركيزًا أقل على منع سلوك التطبيق غير الصحيح من JDOM.
DOM4J هي واجهة برمجة تطبيقات Java XML ممتازة للغاية ، مع أداء ممتاز ، وظائف قوية وسهلة الاستخدام للغاية. إنه أيضًا برنامج مفتوح المصدر. في الوقت الحاضر ، يمكنك أن ترى أن المزيد والمزيد من برامج Java تستخدم DOM4J لقراءة وكتابة XML. تجدر الإشارة بشكل خاص إلى أنه حتى Sun's Jaxm تستخدم DOM4J.
【ميزة】
① يستخدم فئة مجموعة Java على نطاق واسع لتسهيل مطوري Java وتوفير بعض الطرق البديلة لتحسين الأداء.
support xpath.
③ لها أداء جيد.
【عيب】
① يتم استخدام الواجهة على نطاق واسع ، و API معقدة نسبيًا.
2. مقارنة
1. DOM4J لديه أفضل أداء ، وحتى Sun's Jaxm يستخدم DOM4J. حاليًا ، تستخدم العديد من المشاريع المفتوحة المصدر DOM4J بكميات كبيرة ، مثل السبات الشهير يستخدم DOM4J أيضًا لقراءة ملفات تكوين XML. إذا لم يتم النظر في قابلية النقل ، فسيتم استخدام DOM4J.
2. JDOM و DOM أداء ضعيفًا أثناء اختبار الأداء ، يفيض الذاكرة عند اختبار مستندات 10 أمتار ، ولكن محمولة. كما أنه يستحق النظر في DOM و JDOM في حالة الوثائق الصغيرة. في حين أن مطوري JDOM قد ذكروا أنهم يتوقعون التركيز على مشكلات الأداء قبل الإصدار الرسمي ، من وجهة نظر الأداء ، فإنها لا توصي حقًا. بالإضافة إلى ذلك ، لا يزال DOM اختيارًا جيدًا للغاية. يستخدم تنفيذ DOM على نطاق واسع في مجموعة متنوعة من لغات البرمجة. إنه أيضًا أساس العديد من المعايير الأخرى المتعلقة بـ XML ، حيث إنها توصيات W3C رسميًا (على عكس نماذج Java غير القياسية) ، لذلك قد تكون هناك حاجة إليها في بعض أنواع المشاريع أيضًا (مثل استخدام DOM في JavaScript).
3. SAX يؤدي أداء أفضل ، وهو ما يعتمد على طريقة التحليل المحددة - التي تعتمد على الحدث. يكتشف Sax دفق XML القادم ، ولكن لا يتم تحميله في الذاكرة (بالطبع ، عند قراءة دفق XML ، سيتم إخفاء بعض المستندات مؤقتًا في الذاكرة).
رأيي: إذا كان مستند XML كبيرًا ولا ينظر في مشكلات قابلية النقل ، فمن المستحسن استخدام DOM4J ؛ إذا كان مستند XML صغيرًا ، فمن المستحسن استخدام JDOM ؛ إذا كانت هناك حاجة إلى معالجتها في الوقت المناسب دون حفظ البيانات ، فمن المستحسن النظر في SAX. ولكن بغض النظر عن ماذا ، فإن نفس الجملة هي: أفضل شيء هو الشيء الصحيح. إذا سمح الوقت ، فمن المستحسن أن تجرب هذه الطرق الأربعة واختيار واحدة تناسبك.
ثالثا. مثال
من أجل توفير المساحة ، لا يتم تقديم هذه الطرق الأربعة والاختلافات في إنشاء مستندات XML هنا في الوقت الحالي. يتم تقديم رمز تحليل مستندات XML فقط. إذا كان هناك حاجة إلى مشروع كامل (بناء مستندات XML + تحليل XML + اختبار الاختبار).
فيما يلي محتوى XML التالي كمثال على التحليل:
<؟ <AGE> 23 </EMEN> <ESS> أنثى </sex> </suster> <user id = "3"> <name> wh </same> <teg> 24 </age> <exh> ذكر </sex> </user> </user>
حدد أولاً واجهة تحليل مستندات XML:
/*** Author Alexia** حدد الواجهة الخاصة بتوصيل مستند XML*/الواجهة العامة XmlDocument {/*** parse xml document** param filename* file full path name*/public void parserxml (fileName) ؛} 1. مثال دوم
package com.xml ؛ import java.io.filenotfoundException ؛ import java.io.fileOutputStream ؛ import java.ioexception ؛ import java.io.printwriter javax.xml.parsers.parserconfigurationexception ؛ import javax.xml.transform.outputkeys ؛ import javax.xml.transform.transformer ؛ import javax.xml.transform.transformerConfiguration ؛ import javax.xml.transform.transpection ؛ javax.xml.transform.transformerfactory ؛ import javax.xml.transform.domsource ؛ import javax.xml.transform.stream.streamrult ؛ org.xml.sax.saxexception ؛/** * Author Alexia * * dom parsing xml document */public class domdemo تنفذ xmldocument {وثيقة وثيقة خاصة ؛ public void parserxml (string filename) {try {documentBuilderFactory dbf = documentBuilderFactory.newinstance () ؛ documentBuilder db = dbf.newdocumentBuilder () ؛ وثيقة المستند = db.parse (اسم الملف) ؛ مستخدمي nodelist = document.getChildNodes () ؛ لـ (int i = 0 ؛ i <user.getLength () ؛ i ++) {node user = user.item (i) ؛ nodelist userInfo = user.getChildNodes () ؛ لـ (int j = 0 ؛ j <userInfo.getLength () ؛ j ++) {node node = userinfo.item (j) ؛ nodelist usermeta = node.getChildNodes () ؛ لـ (int k = 0 ؛ k <usermeta.getLength () ؛ k ++) {if (usermeta.item (k) .getnodename ()! = "#text") system.out.println (usermeta.item (k) .getnodename () + ": } system.out.println () ؛ }}} catch (fileNotfoundException e) {e.printStackTrace () ؛ } catch (parserConFigurationException e) {e.printStackTrace () ؛ } catch (saxException e) {e.printstacktrace () ؛ } catch (saxException e) {e.printstacktrace () ؛ } catch (saxException e) {e.printstacktrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} 2. مثال ساكس
package com.xml ؛ import java.io.fileInputStream ؛ import java.io.filenotfoundException ؛ import java.io.fileOutputStream ؛ import java.ioexception ؛ import java.io.inputstream ؛ import java.io.itputstream ؛ import java.io javax.xml.parsers.parserconfigurationexception ؛ استيراد javax.xml.parsers.saxparser ؛ استيراد javax.xml.parsers.saxparserfactory javax.xml.transform.transformerConfigurationException ؛ import javax.xml.transform.saxtransformerfactory ؛ import javax.xml.transform.sax.transformerler ؛ import javax.xml.transform.stream.stream. org.xml.sax.saxexception ؛ استيراد org.xml.sax.helpers.attributesimpl ؛ استيراد org.xml.sax.helpers.defaulthandler ؛/** * uuthor Alexia * * sax parsing xml document */public class saxdemo pireements saxparserfactory saxfac = saxparserfactory.newinstance () ؛ حاول {saxparser saxparser = saxfac.newsaxparser () ؛ inputStream هو = جديد fileInputStream (اسم الملف) ؛ saxparser.parse (IS ، new MySaxHandler ()) ؛ } catch (parserConFigurationException e) {e.printStackTrace () ؛ } catch (saxException e) {e.printstacktrace () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} class mysaxHandler يمتد defaulthandler {boolean hasattribute = false ؛ سمات السمات = فارغة ؛ public void startDocument () يلقي saxexception {// system.out.println ("بدأ المستند الطباعة") ؛ } public void enddocument () يلقي saxexception {// system.out.println ("انتهت المستند الطباعة") ؛ } public void startlement (String uri ، string localname ، Qname Qname ، entributes) يرمي saxexception {if (qname.equals ("المستخدمين")) {return ؛ } if (qname.equals ("user")) {return ؛ } if (attributes.getLength ()> 0) {this.attributes = entributes ؛ this.hasattribute = true ؛ }} public void endelement (String uri ، string localname ، string qname) يرمي saxexception {if (hasattribute && (سمات! = null)) {for (int i = 0 ؛ i <attributes.getLength () ؛ i ++) }}} أحرف void العامة (char [] ch ، int ، طول int) يلقي saxexception {system.out.print (سلسلة جديدة (ch ، ابدأ ، طول))) ؛ }} 3. مثال JDOM
package com.xml ؛ import java.io.filenotfoundException ؛ import java.io.fileOutputStream ؛ import java.ioException ؛ import java.util.list ؛ import org.jdom2.input.input.inpuity ؛ org.jdom2.element ؛ import org.jdom2 org.jdom2.output.xmloutputter ؛/** * Author Alexia * * JDOM PARSING XML Documents * */public class jDOMDEMO تنفذ xmldocument {public void parserxml (اسم ملف السلسلة) {saxbuilder builder = new saxbuilder () ؛ حاول {document document = builder.build (اسم الملف) ؛ مستخدمي العنصر = document.getRootElement () ؛ قائمة userlist = user.getChildren ("user") ؛ لـ (int i = 0 ؛ i <userlist.size () ؛ i ++) {element user = (element) userList.get (i) ؛ قائمة userInfo = user.getChildren () ؛ لـ (int j = 0 ؛ j <userinfo.size () ؛ j ++) {system.out.println (((element) userInfo.get (j)). getName () + ":" + (element) userInfo.get (j)). } system.out.println () ؛ }} catch (jdomexception e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} 4. مثال DOM4J
package com.xml ؛ import java.io.file ؛ import java.io.filewRiter ؛ import java.io.ioException ؛ import java.io.writer ؛ import java.Util.iterator ؛ import arg.dom4j.document ؛ import brg.dom4j.documentexception ؛ import org.documentHelmper ؛ org.dom4j.io.saxReader ؛ استيراد org.dom4j.io.xmlWriter ؛/** * author Alexia * * dom4j parse xml document */public class dom4jdemo تنفذ xmldocument {public void parserxml (string filedilem) SaxReader SaxReader = New SaxReader () ؛ حاول {document document = saxreader.read (inputXML) ؛ مستخدمي العنصر = document.getRootElement () ؛ لـ (iterator i = user.elementIrator () ؛ i.hasNext () ؛) {element user = (element) لـ (iterator j = user.elementIrator () ؛ System.out.println (node.getName () + ":" + node.getText ()) ؛ } system.out.println () ؛ }} catch (documentException e) {system.out.println (e.getMessage ()) ؛ }}}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.