الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

XML( Write & Read )

بدأه Pagera في 28 ديسمبر 2005 · 7 رد · 3,775 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سأشرح كيفية انشاء ملف XML

هذه التقنية الموجودة عند الجافا تسمى JAXP

Java API for XML Processing

وهي تقسم الى قسمين

الأول وهو DOM

Document Object Model

وهو ما سأشرحه اليوم هنا

والثاني هو SAX

Simple API for XML

وهو ما سأتحدث عنه لاحقا بدرس آخر

سنبدأ من DOM

وهي تفنية تعتمد على قراءة ملف ال XML ووضعه في الذاكرة

وتستطيع الحصول على معلومات الملف على شكل

Objects Tree

في هذا الدرس سنتكلم عن كيفية انشاء ملف XML

ومن ثم سنقرأ هذا الملف

هذا هم المثال::

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class SampleXMLWriter
{

    public SampleXMLWriter()
    {
    }


    public static void main(String a[])
    {

    File xmlFile = new File("SampleXML.xml");

    DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance();

    try
    {

     DocumentBuilder builder = factory.newDocumentBuilder();


     Document document = builder.newDocument();

     Element root = document.createElement("root");

     document.appendChild(root);

     Element date = document.createElement("date");
     date.appendChild(document.createTextNode("July 31 2005"));


     Element student = document.createElement("student");
     student.setAttribute("course","English");
     student.setAttribute("level","Advance");
     Element firstName = document.createElement("firstname");
     firstName.appendChild(document.createTextNode("Pagera"));

     Element lastName = document.createElement("lastname");
     lastName.appendChild(document.createTextNode("Pagera"));
     student.appendChild(firstName);
     student.appendChild(lastName);



     root.appendChild(date);
     root.appendChild(student);


     Source xmlSource = new DOMSource( document );


     Result result = new StreamResult( new FileOutputStream(xmlFile) );


    TransformerFactory transformerFactory = TransformerFactory.newInstance();


    Transformer transformer =
    transformerFactory.newTransformer();
   
     transformer.transform( xmlSource, result );

 }

  catch(TransformerFactoryConfigurationError factoryError )
    {
    factoryError.printStackTrace();
    }
   catch (ParserConfigurationException pc)
     {
       pc.printStackTrace();
     }
   catch (IOException io)
     {
      io.printStackTrace();
     }
   catch(Exception excep )
    {
       excep.printStackTrace();
    }

}
}

الشرح اولا يجب علينا انشاء ملف سنعطيه اسم SampleXMLWriter.xml

بعد هذه

علينا انشاء instance من DocumentBuilderFactory

الذي سننشئ من خلاله DocumentBuilder

الذي سننشئ منه ال Document

وهو ال Class الذي سيمكننا من انشاء XML Tags

او Elements

اول ما نبدأ به هو انشاء Element وهو الذي يمثل ال Root

لملف ال XML تستطيع ان تعطيه اي اسم فهو ال Tag

الذي سيحوي جميع Tags ملف ال XML

بعد أن أنشأنا ال Root الآن نستطيع ان نضيف عليه ما شئنا من Tags

طبعا جميع ال Tags سيتم انشائها عن طريق ال Document

ومن ثم نضيفها الى ال Tag الرئيسي وهو ال Root

كما نلاحظ هنا انشأنا Tag وأعطيناه الاسم date

كما واعطيماه قيمة وهي July 31 2005

بعدها أنشأنا Tag أخر باسم student

واضفنا له Attributes

عن طريق setAttribute() method

وهذا ال method يحتاج Two Parameters

الأول يمثل اسم ال Attribute

والثاني يمثل القيمة لهذا ال Attribute

بعد ذلك انشأنا Tow Elements

FirstName and LastName

وأعطيناهم قيم عن طريق createTextNode() method

ومن ثم أضفنا ال Tow Element

الى ال Student Element

ملف ال XML هو عبارة عن Tree

كل Element يحتوي على قيمة او مجموعة من Elements

ايضا يحتوي مجموعة من Attributes

بعد ان انتهينا من انشاء ملف ال XML بالنموذج الذي نريد

والذي حتى الآن موجود ضمن Document class طبعا بالذاكرة

الآن يجب علينا كتابة هذا الملف على الهارد داخل الملف الذي أنشاناه في البداية وهو SampleXMLWriter.xml

ويتم عن طريق ال Transformer Class

ولانشاء هذا الملف نحتاج الى عدة خطوات ولا علينا انشاء Class من نوع

TransformerFactory

والذي سننشئ عن طريقه Transformer Class

ومن Transformer نستدعي transform() method

والذي يحتاج Two Parameter

والأول وهو DOMSource

والذي يمثل ال Document الذي انشأ فيه نموذج ملف ال XML

وقد أنشأناه هنا Source xmlSource = new DOMSource( document );

والثاني وهو StreamResult

والذي يمثل الملف الذي نريد الكتابة فيه

والذ فتحنا OutputStream معه هنا

Result result = new StreamResult( new FileOutputStream(xmlFile) );

وبهذا سيتم انشاء ملف ال XML بالنموذج الذي نريد

وهذا هو

  <?xml version="1.0" encoding="UTF-8" ?> 
- <root>
  <date>July 31 2005</date> 
- <student course="English" level="Advance">
  <firstname>Pagera</firstname> 
  <lastname>Pagera</lastname> 
  </student>
  </root>

...........

أتمنى ان اكون قد وفقت بالشرح

واذا فيه اي شي مو واضح يا ريت تخبروني كرمال حاول اوضحوا اكتر

تابعوا الدرس القادم الذي سنقرأ فيه ملف ال XML الذي انشأناه هنا

خمل المثال من المرفقات

Wraiter.zip

تم تعديل هذه المشاركة بواسطة Pagera في 28 ديسمبر 2005 في 16:46

1

Never Let The Fear Of Striking Out

Keep You From Playing The Game

logo.gif

#2

في المثال الآتي سنفترض أن هناك ملف XML يحوي على بعض المعلومات وهو على هذا الشكل

وهو نفس الملف الذي تكلمنا عنه في الموضوع الماضي

   <?xml version="1.0" encoding="UTF-8" ?> 
- <root>
  <date>July 31 2005</date> 
- <student course="English" level="Advance">
  <firstname>Pagera</firstname> 
  <lastname>Pagera</lastname> 
  </student>
  </root>

هذا هو المثال لقراءة الملف

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

public class SampleXMLReader
{


     public static void main(String arg[])
   {
      try {

    DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance();

    DocumentBuilder builder = factory.newDocumentBuilder();

    Document document = builder.parse( new File("SampleXML.xml") );

    Node allNodes = document.getDocumentElement();


    NodeList  rootNode = allNodes.getChildNodes();



     for(int i = 0; i < rootNode.getLength(); i++)
       {


        if(!rootNode.item(i).getNodeName().equals("#text") )
         {

          System.out.print(" Element Name  :   " + rootNode.item(i).getNodeName() );

           if(rootNode.item(i).getNodeName().equals("student"))
          {

          NamedNodeMap attributs = rootNode.item(i).getAttributes();

          for(int u = 0; u < attributs.getLength(); u++)
          System.out.println("\n Attribut Name  :   " + attributs.item(u).getNodeName() +
                             "   ------->   Value :   " + attributs.item(u).getNodeValue());

          }

          else
          {

          System.out.println(" -------> Value :   " + rootNode.item(i).getFirstChild().getNodeValue() );

          }



         }

       }
      }

     catch ( ParserConfigurationException parserError ) {

           parserError.printStackTrace();
         }

     catch ( IOException io ) {

           io.printStackTrace();
         }

     catch ( SAXException parseException ) {

             parseException.printStackTrace();
           }

   }
}

الشرح

أولا علينا انشاء instance من DocumentBuilderFactory

لننشئ منه ال DocumentBuilder والذي بدوره سيقوم بقراءة ملف ال XML عن طرق

parse() Method والذي سنمرر له File الذي بدوره سنمرر له مسار ملف ال XML

ووضعه في Object من نوع Document

والذي يحوي على ال Tree Objects التي تمثل جميع ال XML Tags مع قيمها

بعد أن حصلنا على Document سنستدعي منها

getDocumentElement();

والتي تحوي على جميع ال Tags على شكل Node

ومن هذه ال Node نستدعي

getChildNodes() method

التي ستعيد لنا Object من نوع NodeList

وهي عبارة عن List تمثل ال root tag بما تحويه من Tags

في الحلقة سنحاول استخراج أسماء ال Tags مع قيمها

لكن هناك ملاحظة أنه عند قراءة ملف ال XML ستجد أن هناك فراغات تقرأ على شكل (#text)

وهي موجودة بين Tags

وهنا تفاديتها عن طريق وضع شروط كما هو موجود في الحلقة

في المرة الأولى لدخول الحلقة يتم قراءة اسم date وقيمته

في الدخول الثاني يتم قراءة اسم student و باعتبار هذا ال Tag لا يملك قيمة

وتفاديا لحدوث Exception هناك شرط اذا تحقق الشرط

فسيتم دخول الحلقة الداخلية والتي بدورها ستدور حول ال Attributes

لطباعة الأسماء والقيم لل Attributes

في داخل هذا الشرط يتم استخراج ال Attributes عن طريق استدعاء .getAttributes()

والتي ستعيد لنا Object من نوع NamedNodeMap والذي يحوي على أسماء وقيم ال Attribute

أرجو أن يكون المثال واضح

وأي سؤال أنا جاهز

المثال موجود بالمرفقات

Reader.zip

Never Let The Fear Of Striking Out

Keep You From Playing The Game

logo.gif

#3

درس رائع.. شكرا للمجهود المبذول...

و اذا لم تجد استجابة كما تتوقع ليس لان الدرس ليس جيد او يشكو من عيب ما و لكن هذه الفترة فترة امتحانات فصلية و ينخفض عدد المشاركات كثيرا...

سؤال خارجي : من اي منطقة في سورية تقيم حضرتك

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#4

مشكور أخي العزيز على الدرس الرائع .... ممكن تصبر علينا قليلا ... بدأت الامتحانات و الكل مشغول ..... بالمناسبة أنا يهمني جدا تعلم XML لذلك ستمل مني و من أسئلتي ... فقط انتظر

مدونتي

http://mbnoimi.net

#5

أخي باغيرا ....

كتابة ملف xml في المثال الأول فهمته بشكل جيد ... لكن :

1 - عند قراءة ملف xml هل يجب علينا دائما البحث عن العقد Nodes الفرعية ؟؟؟؟

استعمال الحلقات مع الملفات الطويلة يشكل عائق كبير بالأداء .... سبب سؤالي هو أنني أفكر بالاستغناء عن محركات قواعد البيانات في بعض الحالات و الاستعاضة عنها بتقنية xml .... لذلك أتساءل ألا يوجد محرك ما يقوم بتنفيذ هذه الوظيفة من أجل ضمان سرعة الأداء بدلا من استعمال الحلقات ؟؟؟

2 - في الكثير من البرامج ألاحظ أنه عند تنفيذ البرنامج يتم استدعاء xml parser قبل اجراء عملية القراءة و الكتابة فما هو السبب يا ترى ؟؟؟

مدونتي

http://mbnoimi.net

#6

الأخ رامي العيساوي مو مشكلة الاستجابة المهم الاستفادة

وبخصوصو من وين انا

انا من اللادئية بس ساكن بحلب

NUCLEAR بصراحة ما فهمت السؤال

C&DEL يا سيدي اسأل متل ما بدك باذن الله منشوف الحل للأسئلة مع بعض

وبخصوص البحث عن ال Nodes

بالتأكيد رح نضل نبحث عنهم

لأنو ملف ال XML هو عبارة عن مجموعة من Nodes

هو Tree Nodes

كل Node تحتوي على Node أخرى

أو تحتوي على Attributes

وبخصوص عملية Parse

هذه ال method تقوم بتهيئة محتويات الملف ليصبح xml document

وتعيد Dom Document لكي تستطيع ال Classes الاخرى

بقرائته بشكل صحيح

وكرمال الاستغناء عن الحلقات اكيد فيه طريقة انت بس طول بالك علي

انا ذكرت ببداية الموضوع انو فيه طريقتان لقراءة ملف ال XML

الطريقة الاخرى عن طريق ال SAX

Simple API for XML

وهي طريقة تعتمد على مبدأ Event

يعني بدل ما نعمل حلقة نحن نعلن method يستقبل Event معينة

يعني يتم اطلاق هذه ال Event عن الوصول الى بداية Node

وهناك Event تطلق عند قراءة ال Attributes

طريقة ال SAX اسرع ولكنها معقدة بعض الشئ

بخلاف طريقة ال DOM واللي هي طريقة بسيطة وسهلة

انت بس طول بالك علي لحتى افضى شوي

وانا ذكرت بالموضوع انوا رح احكي عن ال SAX بموضوع آخر

باذن الله رح نزل موضوع بهالخصوص بس افضى شوي

تم تعديل هذه المشاركة بواسطة Pagera في 1 يناير 2006 في 16:25

Never Let The Fear Of Striking Out

Keep You From Playing The Game

logo.gif

#7

أعتقد أن الموضوع يستحق العافية

يعطيك ألف عافية

:)

#8

موضوع رائع اسجل اعجابي به

مواضيع مشابهة