1. دوم (Jaxp Crimson Parser)
DOM هو معيار W3C الرسمي لتمثيل مستندات XML بطريقة مستقلة عن النظام الأساسي واللغة. DOM هي مجموعة من العقد أو شظايا المعلومات المنظمة في التسلسل الهرمي. يتيح هذا التسلسل الهرمي للمطورين البحث عن معلومات محددة في الشجرة. يتطلب تحليل هذا الهيكل عادة تحميل المستند بأكمله وبناء التسلسل الهرمي قبل القيام بأي عمل. نظرًا لأنه يعتمد على مستوى المعلومات ، فإن DOM تعتبر قائمة على الأشجار أو قائمة على الكائن. DOM والمعالجة القائمة على الأشجار المعممة لها العديد من المزايا. أولاً ، نظرًا لأن الشجرة ثابتة في الذاكرة ، يمكن تعديلها بحيث يمكن للتطبيق إجراء تغييرات على البيانات والهيكل. كما يتيح لك التنقل لأعلى ولأسفل الشجرة في أي وقت ، بدلاً من أن تكون وظيفة لمرة واحدة مثل ساكس. دوم أبسط بكثير للاستخدام.
2. ساكس
مزايا معالجة SAX تشبه إلى حد كبير مزايا البث. يمكن أن يبدأ التحليل على الفور ، بدلاً من انتظار معالجة جميع البيانات. وبما أن التطبيق لا يتحقق إلا من البيانات عند قراءتها ، فلا يحتاج إلى تخزين البيانات في الذاكرة. هذه ميزة كبيرة للوثائق الكبيرة. في الواقع ، لا يتعين على التطبيق تحليل المستند بأكمله ؛ يمكن أن يتوقف عن التحليل عند استيفاء حالة معينة. بشكل عام ، SAX أسرع بكثير من استبدال DOM.
اختر دوم أو ساكس؟ بالنسبة للمطورين الذين يحتاجون إلى كتابة التعليمات البرمجية الخاصة بهم لمعالجة مستندات XML ، فإن اختيار نموذج تحليل DOM أو SAX هو قرار تصميم مهم للغاية. يستخدم DOM طريقة إنشاء بنية شجرة للوصول إلى مستندات XML ، بينما يستخدم SAX نموذج الحدث.
يحول محلل DOM مستند XML إلى شجرة تحتوي على محتوياتها ويمكن أن يعبر الشجرة. ميزة تحليل النموذج مع DOM هي أنه من السهل البرمجة. يحتاج المطورون فقط إلى استدعاء تعليمات صنع الأشجار ثم استخدام واجهات برمجة تطبيقات التنقل للوصول إلى عقد الأشجار المطلوبة لإكمال المهمة. من السهل إضافة وتعديل العناصر في الشجرة. ومع ذلك ، نظرًا لأن وثيقة XML بأكملها تحتاج إلى معالجة عند استخدام محلل DOM ، فإن متطلبات الأداء والذاكرة مرتفعة نسبيًا ، خاصة عند مواجهة ملفات XML الكبيرة. نظرًا لقدراتها على اجتيازها ، غالبًا ما يتم استخدام محلات DOM في الخدمات حيث تتطلب مستندات XML تغييرات متكررة.
يتبنى محلل ساكس نموذجًا قائمًا على الحدث. يمكن أن يؤدي إلى سلسلة من الأحداث عند تحليل وثيقة XML. عند العثور على علامة معينة ، يمكنها تنشيط طريقة رد الاتصال لمعرفة الطريقة التي تم العثور على العلامة. يتطلب SAX عادةً ذاكرة منخفضة لأنها تتيح للمطورين تحديد العلامات التي يرغبون في معالجتها. خاصة عندما يحتاج المطورون فقط إلى معالجة جزء من البيانات الواردة في المستند ، فإن قدرة توسيع SAX تنعكس بشكل أفضل. ومع ذلك ، يكون الترميز صعبًا عند استخدام SAX Parser ، ومن الصعب الوصول إلى بيانات مختلفة متعددة في نفس المستند في نفس الوقت.
3. JDOM HTTP://www.jdom.org
الغرض من 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.
4. DOM4J http://dom4j.sourceforge.net
على الرغم من أن 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.
مقارنة بين الطرق الأربعة
يتمتع DOM4J بأفضل أداء ، وحتى Sun's Jaxm يستخدم DOM4J. حاليًا ، تستخدم العديد من المشاريع المفتوحة المصدر DOM4J بكميات كبيرة ، مثل السبات الشهير يستخدم DOM4J أيضًا لقراءة ملفات تكوين XML. إذا لم يتم النظر في قابلية النقل ، فسيتم استخدام DOM4J.
أداء JDOM و DOM بشكل سيئ أثناء اختبار الأداء ، تفيض الذاكرة عند اختبار 10M مستندات. كما أنه يستحق النظر في DOM و JDOM في حالة الوثائق الصغيرة. في حين أن مطوري JDOM قد ذكروا أنهم يتوقعون التركيز على مشكلات الأداء قبل الإصدار الرسمي ، من وجهة نظر الأداء ، فإنها لا توصي حقًا. بالإضافة إلى ذلك ، لا يزال DOM اختيارًا جيدًا للغاية. يستخدم تنفيذ DOM على نطاق واسع في مجموعة متنوعة من لغات البرمجة. إنه أيضًا أساس العديد من المعايير الأخرى المتعلقة بـ XML ، حيث إنها توصيات W3C رسميًا (على عكس نماذج Java غير القياسية) ، لذلك قد تكون هناك حاجة إليها في بعض أنواع المشاريع أيضًا (مثل استخدام DOM في JavaScript).
يعمل SAX بشكل أفضل ، وهو ما يعتمد على طريقة التحليل الخاصة به - يحركها الأحداث. يكتشف Sax دفق XML القادم ، ولكن لا يتم تحميله في الذاكرة (بالطبع ، عند قراءة دفق XML ، سيتم إخفاء بعض المستندات مؤقتًا في الذاكرة).
الاستخدام الأساسي لأربعة طرق تشغيل XML
ملف XML:
<؟ المقاطعة </addr> </value> </result >
1) طريقة تنفيذ DOM
استيراد java.io.*؛ استيراد java.util.*؛ استيراد org.w3c.dom.*؛ استيراد javax.xml.parsers.*؛ الفئة العامة myxmlreader {public static void main (string arge []) حاول {file f = new file ("data_10k.xml") ؛ DocumentBuilderFactory Factory = documentBuilderFactory.NewInstance () ؛ DocumentBuilder Builder = factory.newdocumentBuilder () ؛ مستند المستند = builder.parse (f) ؛ nodelist nl = doc.getElementsByTagName ("value") ؛ لـ (int i = 0 ؛ i < nl.getLength () ؛ i ++) {system.out.print ("رقم لوحة الترخيص:"+doc.getElementsByTagName ("no"). البند (i) .getFirstChild (). getNodevalue ()) ؛ System.out.println ("عنوان المالك:" + doc.getElementsByTagName ("addr"). البند (i) .getFirstChild (). getNodevalue ()) ؛ }} catch (استثناء e) {e.printstacktrace () ؛} 2) طريقة تنفيذ SAX
استيراد org.xml.sax.*؛ استيراد org.xml.sax.helpers.*؛ استيراد javax.xml.parsers.*؛ الطبقة العامة myxmlreader تمتد defaulthandler {java.util.stack tags = new java.util.stack () ؛ public myxmlReader () {super () ؛} public static void main (string args []) {long larcerderd = system.currentTimeMillis () ؛ حاول {saxparserfactory sf = saxparserfactory.newinstance () ؛ saxparser sp = sf.newsaxparser () ؛ myxmlreader reader = new myxmlreader () ؛ sp.parse (new inputsource ("data_10k.xml") ، reader) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } system.out.println ("وقت التشغيل:" + (System.CurrentTimeMillis () - دائمًا) + "milliseconds") ؛} أحرف void العامة (char ch [] ، int ، طول int) يلقي saxexception {string tag = (string) tags.peek () ؛ if (tag.equals ("no")) {system.out.print ("رقم لوحة الترخيص:" + سلسلة جديدة (ch ، بدء ، طول)) ؛} if (tag.equals ("addr")) {system.out.println ("العنوان:" tags.push (qname) ؛}} 3) طريقة تنفيذ JDOM
استيراد java.io.*؛ استيراد java.util.*؛ استيراد org.jdom.*؛ استيراد org.jdom.input.*؛ الطبقة العامة myxmlReader {public static void main (سلسلة arge []) {long argerdring = System.CurrentTimIlis () ؛ حاول {saxbuilder builder = new saxbuilder () ؛ مستند المستند = builder.build (ملف جديد ("data_10k.xml")) ؛ element foo = doc.getRootElement () ؛ قائمة allchildren = foo.getChildren () ؛ لـ (int i = 0 ؛ i < allchildren.size () ؛ i ++) {system.out.print ("رقم لوحة الترخيص:"+((element) allchildren.get (i)). getChild ("no"). getText ()) ؛ System.out.println ("عنوان المالك:" + ((element) allchildren.get (i)). getChild ("addr"). getText ()) ؛ }} catch (استثناء e) {e.printstacktrace () ؛}} 4) طريقة تنفيذ DOM4J
استيراد java.io.*؛ استيراد java.Util.*؛ استيراد org.dom4j.*؛ استيراد org.dom4j.io.*؛ الطبقة العامة myxmlreader {public static void main (سلسلة arge []) {long largresterd = system.currenttimilis () ؛ حاول {file f = new file ("data_10k.xml") ؛ قارئ SaxReader = New SaxReader () ؛ مستند المستند = reader.read (f) ؛ العنصر جذر = doc.getRootElement () ؛ العنصر فو ؛ لـ (iterator i = root.elementIterator ("value") ؛ i.hasNext () {foo = (element) E.PrintStackTrace () ؛})