في Java، هناك طريقتان لتحليل مستندات XML أصلاً، وهما: تحليل Dom وتحليل Sax.
وظيفة تحليل Dom قوية ويمكن إضافتها وحذفها وتعديلها والتحقق منها أثناء التشغيل، ستتم قراءة مستند XML في الذاكرة في شكل كائن مستند، لذا فهو مناسب للمستندات الصغيرة.
يقرأ تحليل Sax المحتوى سطرًا تلو الآخر وعنصرًا تلو الآخر من البداية إلى النهاية، وهو أمر غير مريح للتعديل، ولكنه مناسب للمستندات الكبيرة للقراءة فقط.
تشرح هذه المقالة بشكل أساسي تحليل ساكس، وسيتم وضع الباقي لاحقًا.
يستخدم Sax أسلوبًا يحركه الحدث لتحليل المستندات. بكل بساطة، يشبه الأمر مشاهدة فيلم في السينما، يمكنك مشاهدته من البداية إلى النهاية دون الرجوع إلى الوراء (يستطيع دوم قراءته ذهابًا وإيابًا).
أثناء مشاهدة فيلم، في كل مرة تواجه فيها مؤامرة أو دمعة أو لقاء كتفًا بكتف، سوف تقوم بتعبئة عقلك وأعصابك لتلقي هذه المعلومات أو معالجتها.
وبالمثل، أثناء عملية تحليل Sax، ستؤدي قراءة بداية ونهاية المستند وبداية العنصر ونهايته إلى تشغيل بعض طرق رد الاتصال. يمكنك إجراء معالجة الأحداث المقابلة في طرق رد الاتصال هذه.
الطرق الأربع هي: startDocument()، endDocument()، startElement()، endElement
بالإضافة إلى ذلك، لا يكفي قراءة العقدة، بل نحتاج أيضًا إلى طريقة الأحرف () لمعالجة المحتوى الموجود في العنصر بعناية.
من خلال جمع أساليب رد الاتصال هذه، يتم تشكيل فئة، وهو المشغل الذي نحتاجه.
بشكل عام، تتم قراءة المستند من خلال الطريقة الرئيسية، ولكن تتم معالجة المستند في المشغل. وهذا ما يسمى بطريقة التحليل المستندة إلى الحدث.
كما هو موضح أعلاه، في المشغل، يبدأ أولاً في قراءة المستند، ثم يبدأ في تحليل العناصر واحدًا تلو الآخر، وسيتم إرجاع محتوى كل عنصر إلى طريقة الأحرف ().
ثم قم بإنهاء قراءة العنصر بعد قراءة جميع العناصر، قم بإنهاء تحليل المستند.
الآن نبدأ في إنشاء فئة المشغل لإنشاء هذه الفئة، نحتاج أولاً إلى وراثة DefaultHandler
قم بإنشاء SaxHandler وتجاوز الطريقة المقابلة:
الطبقة العامة SaxHandler تمتد DefaultHandler {
/* تحتوي هذه الطريقة على ثلاث معلمات
arg0 هو مصفوفة الأحرف التي تم إرجاعها والتي تحتوي على محتوى العنصر
arg1 و arg2 هما موضعا البداية والنهاية للمصفوفة على التوالي*/
@تجاوز
أحرف باطلة عامة (char[] arg0, int arg1, int arg2) تطرح SAXException {
محتوى السلسلة = سلسلة جديدة (arg0، arg1، arg2)؛
System.out.println(content);
super.characters(arg0, arg1, arg2);
}
@تجاوز
endDocument () الفراغ العام يلقي SAXException {
System.out.println("/n...إنهاء تحليل المستند...");
super.endDocument();
}
/* arg0 هي مساحة الاسم
arg1 هي التسمية التي تحتوي على مساحة الاسم، أو فارغة إذا لم يكن هناك مساحة اسم
arg2 عبارة عن تسمية بدون مساحة اسم*/
@تجاوز
عنصر نهاية الفراغ العام (سلسلة arg0، سلسلة arg1، سلسلة arg2)
يرمي SAXException {
System.out.println("إنهاء عنصر التحليل" + arg2);
super.endElement(arg0, arg1, arg2);
}
@تجاوز
public void startDocument() يلقي SAXException {
System.out.println("………… ابدأ في تحليل المستند………/n");
super.startDocument();
}
/*arg0 هي مساحة الاسم
arg1 هي التسمية التي تحتوي على مساحة الاسم، أو فارغة إذا لم يكن هناك مساحة اسم
arg2 هي التسمية بدون مساحة الاسم
من الواضح أن arg3 عبارة عن مجموعة من السمات*/
@تجاوز
بداية الفراغ العام (سلسلة arg0، سلسلة arg1، سلسلة arg2،
السمات arg3) يطرح SAXException {
System.out.println("ابدأ في تحليل العناصر" + arg2);
إذا (arg3!= فارغة) {
لـ (int i = 0; i < arg3.getLength(); i++) {
// getQName () هو الحصول على اسم السمة،
System.out.print(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(arg2 + ":);
super.startElement(arg0, arg1, arg2, arg3);
}
}
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
عرض تجريبي للفئة العامة {
public static void main(String[] args) يطرح الاستثناء {
// 1. إنشاء كائن SAXParserFactory
SAXParserFactory Factory = SAXParserFactory.newInstance();
// 2. قم بإنشاء محلل
SAXParser parser =factory.newSAXParser();
// 3. احصل على المستند الذي يحتاج إلى تحليل، وقم بإنشاء محلل، وأخيرًا تحليل المستند
الملف f = ملف جديد("books.xml");
SaxHandler dh = new SaxHandler();
parser.parse(f, dh);
}
}
ابدأ بتحليل كتب العناصر
الكتب:
ابدأ في تحليل كتاب العناصر
معرف = "001" كتاب:
ابدأ بتحليل عنوان العنصر
العنوان: هاري بوتر
إنهاء تحليل عنوان العنصر
ابدأ في تحليل مؤلف العنصر
المؤلف:جي كيه رولينغ
إنهاء تحليل مؤلف العنصر
نهاية كتاب تحليل العناصر
ابدأ في تحليل كتاب العناصر
معرف = "002" كتاب:
ابدأ بتحليل عنوان العنصر
العنوان: تعلم لغة XML
إنهاء تحليل عنوان العنصر
ابدأ في تحليل مؤلف العنصر
المؤلف:إريك تي راي
إنهاء تحليل مؤلف العنصر
نهاية كتاب تحليل العناصر
نهاية تحليل كتب العناصر
…………إنهاء تحليل الوثيقة…………
من أجل تنفيذ هذه العملية بشكل أكثر وضوحًا، يمكننا أيضًا إعادة كتابة SaxHandler لاستعادة مستند xml الأصلي
تم تجاوز فئة SaxHandler:
الطبقة العامة SaxHandler تمتد DefaultHandler {
@تجاوز
أحرف باطلة عامة (char[] arg0, int arg1, int arg2) تطرح SAXException {
System.out.print(new String(arg0, arg1, arg2));
super.characters(arg0, arg1, arg2);
}
@تجاوز
endDocument () الفراغ العام يلقي SAXException {
System.out.println("/n ينتهي التحليل");
super.endDocument();
}
@تجاوز
عنصر نهاية الفراغ العام (سلسلة arg0، سلسلة arg1، سلسلة arg2)
يرمي SAXException {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
}
@تجاوز
public void startDocument() يلقي SAXException {
System.out.println("ابدأ التحليل");
String s = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>";
System.out.println(s);
super.startDocument();
}
@تجاوز
بداية الفراغ العام (سلسلة arg0، سلسلة arg1، سلسلة arg2،
السمات arg3) يطرح SAXException {
System.out.print("<");
System.out.print(arg2);
إذا (arg3 != فارغة) {
لـ (int i = 0; i < arg3.getLength(); i++) {
System.out.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(">");
super.startElement(arg0, arg1, arg2, arg3);
}
}
يبدو الآن أفضل بكثير، واستعادته توضح بشكل أفضل عملية التحليل الخاصة به.