العمل مع XML في Java: DOM، SAX، StAX و JAXB
XML (لغة الترميز القابلة للتوسع) لا يزال أحد التنسيقات الرئيسية لتخزين ونقل البيانات المنظمة. في Java، توجد عدة مكتبات مدمجة وشائعة للعمل مع XML. في هذه المقالة، سنشرح جميع الأساليب الأساسية: من DOM و SAX الكلاسيكيين إلى JAXB الحديث.
1. DOM (نموذج كائن المستند) — وصول كامل إلى المستند
محلل DOM يقوم بتحميل مستند XML بالكامل في الذاكرة على شكل هيكل شجري. وهذا يمنح تحكمًا كاملاً في المستند: يمكن القراءة والتعديل والحذف وإضافة العقد.
مزايا DOM:
- وصول عشوائي إلى أي عنصر في المستند
- إمكانية تعديل هيكل XML
- نموذج كائن بديهي وسهل الفهم
العيوب:
- استهلاك عالي للذاكرة (المستند بأكمله في RAM)
- أداء بطيء مع الملفات الكبيرة
مثال على استخدام DOM:
import javax.xml.parsers.*;import org.w3c.dom.*;import java.io.*;
public class DomExample { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("books.xml"));
NodeList bookList = document.getElementsByTagName("book"); for (int i = 0; i < bookList.getLength(); i++) { Element book = (Element) bookList.item(i); String title = book.getElementsByTagName("title").item(0).getTextContent(); String author = book.getElementsByTagName("author").item(0).getTextContent(); System.out.println(title + " — " + author); } }}2. SAX (واجهة برمجة تطبيقات بسيطة لـ XML) — تحليل تدفقي
SAX هو محلل موجه بالأحداث. يقرأ XML بشكل تسلسلي ويستدعي طرق رد الاتصال (callback) عند مواجهة علامة فتح/إغلاق أو نص أو سمات. يتم استهلاك الحد الأدنى من الذاكرة.
متى تستخدم SAX:
- ملفات XML ضخمة (مئات الميغابايت)
- للقراءة فقط، بدون تعديل
- موارد جهاز محدودة
مثال على محلل SAX:
import org.xml.sax.*;import org.xml.sax.helpers.*;import javax.xml.parsers.*;
public class SaxExample { public static void main(String[] args) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() { boolean isTitle = false;
public void startElement(String uri, String localName, String qName, Attributes attributes) { if (qName.equalsIgnoreCase("title")) isTitle = true; }
public void characters(char ch[], int start, int length) { if (isTitle) { System.out.println("Title: " + new String(ch, start, length)); isTitle = false; } } };
saxParser.parse("books.xml", handler); }}3. StAX (واجهة برمجة تطبيقات التدفق لـ XML) — تحليل تدفقي مريح
StAX هو حل وسط بين DOM و SAX. يعمل أيضًا في وضع التدفق، لكنه يوفر واجهة سحب (pull) أكثر ملاءمة (أنت تطلب العنصر التالي بنفسك).
طريقتان للعمل مع StAX:
- XMLStreamReader — للقراءة
- XMLStreamWriter — للكتابة
import javax.xml.stream.*;import java.io.*;
public class StaxExample { public static void main(String[] args) throws Exception { XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReade