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

كيف اضيف Node جديد في ملف Xml عن طريق الجافا

بدأه شاب مسلم في 7 مارس 2008 · 13 رد · 1,852 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

اخواني الكرام

السلام عليكم ورحمة الله وبركاته

عندي برنامج اخترت ان انفذ قاعده بيناته عن طريق الـ xml

استطعت عن طريق الاستفاده من برنامج لاحد الاعضاء هنا وهو الاخ Pagera

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

الذي اريده كيف اقوم بكتابة البيانات الجديدة بعد البيانات القديمة وليس فوقها

بمعني اذا كان لدي تلميذ اسمه عمر ولديه بيناته

ثم اردت ان اضيف تلميذ جديد وهو خالد فاريد ان تظل بيانات عمر موجوده في الملف بالاضافه لبيانات خالد

ولكن الذي يحدث ان بيانات خالد تكتب فوق بينات عمر

وهذا هو الكود

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.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;


public class VerbXMLWriter
{
	static String arabicVerb3;
	static String englishTranslate3;


	public void VerbXMLWriter(String arabicVerb, String englishTranslate )
	{
		 arabicVerb3 = arabicVerb;
		 englishTranslate3=englishTranslate;





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

	DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance();

	try
	{


	 DocumentBuilder builder = factory.newDocumentBuilder();


	 Document document = builder.newDocument();

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

	 document.appendChild(root);


	 Element verb = document.createElement(arabicVerb3);
	 verb.setAttribute("EnglishTranslate",englishTranslate3);


	 root.appendChild(verb);


	 Source xmlSource = new DOMSource( document );


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


	TransformerFactory transformerFactory = TransformerFactory.newInstance();


	Transformer transformer =
	transformerFactory.newTransformer();
	transformer.setOutputProperty( "indent", "yes" );


	 transformer.transform( xmlSource, result );


 }

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

}




}

وهذا ملف ال XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Verb>
<يلعب EnglishTranslate="playing" />
</Verb>
#2

ارجو المساعده لان الموضوع هام جدا لي

وقد اعياني البحث ولم اجد من تعرض لهذه النقطه مع امثلة

#3

حوالي 40 زائرا للموضوع

ولم اجد اي رد او تعقيب

هل الامر صعب لهذه الدرجه

ام انه شيء جديد لا يعرفه احد

#4

بسم الله الرحمن الرحيم

أخي الكريم ..

في البداية بالرغم من أنه يمكنك تسمية الوسوم (tags) باللغة العربية ( كما في المثال الذي ذكرت) .. إلا أنها ليست فكرة جيدة .. إذ سيصبح من الصعب (إن لم يكن مستحيلاً) قراءة الملف (parsing) بشكل برمجي لاحقاً ..

لذا لنتفق على البنية التالية للعقد (Nodes) في ملفنا :

سنسمي العقدة الجذر للملف <Verbs> و التي ستحوي بدورها على مجموعة من العقد <Verb> و لكل منها فرعان <ArabicVerb> و <EnglishTranslate> كما في المثال :

<Verbs>
  <Verb>
	<ArabicVerb>يلعب</ArabicVerb>
	<EnglishTranslate>playing</EnglishTranslate>
  </Verb>
  <Verb>
	....
  </Verb>

  ....
</Verbs>

أبو خالد السوري

#5

الآن نأتي للبرنامج :

ينبغي التمييز بين ثلاث عمليات : تهيئة مستند XML , إضافة العقد (البيانات) , طباعة المستند إلى ملف .. كل من هذه العمليات سنضعها في إجرائية منفردة ..

تهيئة مستند XML (باني الصف VerbXMLWriter ) :

public VerbXMLWriter() {
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	try {
		DocumentBuilder builder = factory.newDocumentBuilder();
		document = builder.newDocument();
		root = document.createElement("Verbs");
		document.appendChild(root);
	} catch (TransformerFactoryConfigurationError factoryError) {
		factoryError.printStackTrace();
	} catch (ParserConfigurationException pc) {
		pc.printStackTrace();
	} catch (Exception excep) {
		excep.printStackTrace();
	}
}

إضافة البيانات :

public void addVerb(String arabicVerb, String englishTranslate) {
	Element verb = document.createElement("Verb");
	root.appendChild(verb);

	Element av = document.createElement("ArabicVerb");
	av.setTextContent(arabicVerb);
	verb.appendChild(av);

	Element et = document.createElement("EnglishTranslate");
	et.setTextContent(englishTranslate);
	verb.appendChild(et);		
}

طباعة المستند إلى ملف :

public void writeToFile() {
	try {
		File xmlFile = new File("VerbDB.xml");
		Source xmlSource = new DOMSource(document);
		Result result = new StreamResult(new FileOutputStream(xmlFile));
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.setOutputProperty("indent", "yes");
		transformer.transform(xmlSource, result);
	} catch (TransformerFactoryConfigurationError factoryError) {
		factoryError.printStackTrace();
	} catch (IOException io) {
		io.printStackTrace();
	} catch (Exception excep) {
		excep.printStackTrace();
	}
}

الآن عند بدء البرنامج تتم تهيئة المستند .. ثم في كل مرة تريد إضافة عقدة تقوم باستدعاء الإجرائية addVerb و أخيرا عند الانتهاء من إدخال كل البيانات تقوم بحفظ المستند إلى الملف باستدعاء الإجرائية writeToFile

VerbXMLWriter writer = new VerbXMLWriter();

writer.addVerb("يلعب", "play");
writer.addVerb("يأكل", "eat");

writer.writeToFile();

تم تعديل هذه المشاركة بواسطة أبو خالد السوري في 12 مارس 2008 في 00:46

أبو خالد السوري

#6

نسيت أن أذكر أن document و root يجب أن تكون معرفة على مستوى الصف بحيث تكون مرئية من قبل جميع الإجرائيات :

public class VerbXMLWriter {	
	Document document;
	Element root;

	....

}

أبو خالد السوري

#7

اخي الكريم أبوخالد السوري

اسأل الله ان يكتب لك الاجر في مساعدتك لي ولا املك ان ارد لك هذا المعروف غير ان ادعوا الله لك ان يوفقك في الدنيا والاخرة وان يغفر لك ولوالديك.

واحب ايضا اني اشكرك على مفردات اللغة العربية التي استخدمتها في شرحك للموضوع والتي افادتني كثيرا فبارك الله فيك

====

اخي الكريم للاسف المشكلة لم تحل حتى الان

وذلك لاني حينما اريد ان اضيف عقد جديده يمسح القديمه مثل ما كان يحدث سابقا

وذلك لان اضافه العقد تتم عن طريق Gui

وفي كل مرة ينقر المستخدم على زر الادخال يدخل بيانات جديده لعقده واحده فقط ثم يتم حفظ الملف

واذا اراد المستخدم اضافه فعل جديد فيكتب في الـ Gui من جديد ثم ينقر على زر الادخال

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

بمعنى انه يتم باستدعاء الإجرائية addVerb

بهذا الشكل

اقتباس
VerbXMLWriter2 writer = new VerbXMLWriter2();

writer.addVerb(arabicVerb1, englishTranslate1);

writer.writeToFile();

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

وذلك عن طريق هذا الكود

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 VerbXMLReader
{

	static String arabicVerb;


	 public void VerbXMLReader(String word)
		{
			 arabicVerb = word;

System.out.println("arabicVerb:	"+arabicVerb);


	  try {

	DocumentBuilderFactory factory =  DocumentBuilderFactory.newInstance();

	DocumentBuilder builder = factory.newDocumentBuilder();

	Document document = builder.parse( new File("VerbDB.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(arabicVerb))
		  {

		  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();
		   }

   }
}

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

تم تعديل هذه المشاركة بواسطة شاب مسلم في 11 مارس 2008 في 07:54

#8

بسم الله الرحمن الرحيم

أخي الكريم ..

الموضوع ببساطة هو أن تهيئة المستند باستخدام

 VerbXMLWriter writer = new VerbXMLWriter();

ينبغي أن تتم مرة واحدة فقط مع تشغيل البرنامج (ضمن الإجرائية main مثلاً أو ضمن إجرائية بناء الواجهة (Gui)) و ليس في كل مرة تضيف فيها بيانات ..

و كذلك حفظ المستند إلى ملف ( writer.writeToFile ) ينبغي أن تقوم به بعد الانتهاء من إدخال البيانات التي ترغب فيها ..

أما إضافة البيانات باستخدام addVerb فتتم عند الضغط على زر الإدخال (ضمن الإجرائية actionPerformed)

المثال بالكامل :

import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class MainFrame extends JFrame implements ActionListener{

	VerbXMLWriter writer;
	JTextField txtArabicVerb = new JTextField(10);
	JTextField txtEnglishTranslate = new JTextField(10);
	JButton btnAddVerb = new JButton("Add Verb");
	JButton btnSaveFile = new JButton("Save XML File");

	public static void main(String[] args){
		new MainFrame();
	}

	public MainFrame() {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				writer = new VerbXMLWriter(); 
				createAndShowGUI();
			}
		});
	}

	private void createAndShowGUI() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);				
		Container pane = frame.getContentPane();
		pane.setLayout(new GridBagLayout());		
		pane.add(new JLabel("Arabic Verb"), myC(0,0));
		pane.add(txtArabicVerb, myC(1,0));
		pane.add(new JLabel("English Translation"), myC(0,1));
		pane.add(txtEnglishTranslate, myC(1,1));
		btnAddVerb.addActionListener(this);
		pane.add(btnAddVerb, myC(0,2));
		btnSaveFile.addActionListener(this);
		pane.add(btnSaveFile, myC(1,2));				
		frame.pack();
		frame.setVisible(true);
	}

	public void actionPerformed(ActionEvent e){
		Object source = e.getSource();
		if(source == btnAddVerb){
			String arabicVerb = txtArabicVerb.getText();
			String englishTranslate = txtEnglishTranslate.getText();
			writer.addVerb(arabicVerb, englishTranslate);
			clear();
		} else if(source == btnSaveFile){
			writer.writeToFile();
		}
	}

	public void clear(){
		txtArabicVerb.setText("");
		txtEnglishTranslate.setText("");
	}

	public GridBagConstraints myC(int gX, int gY){
		Insets in = new Insets(4,4,4,4);
		return new GridBagConstraints(gX,gY,1,1,0.0,0.0,
			GridBagConstraints.CENTER,GridBagConstraints.BOTH,in,0,0);
	}
}

عند تشغيل هذا البرنامج تتم تهيئة الملف في نفس الوقت الذي يتم فيه بناء الواجهة ..

و من ثم يمكنك إدخال البيانات و الضغط على الزر Add Verb فتتم إضافة البيانات إلى المستند (المحمل في الذاكرة حتى الآن) .. و في أي وقت تريد يمكنك الضغط على الزر Save فيتم حفظ المستند من الذاكرة إلى الملف ..

يمكنك الآن أن تلاحظ أن البيانات الجديدة تتم إضافتها إلى ما سبقها و ليس استبدالها .. و بالتالي كل شيء على ما يرام طالما البرنامج قيد التنفيذ ..

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

لتجاوز هذه المشكلة هناك عدة حلول :

إما أن تقوم في كل مرة تشغل فيها البرنامج باستخدام ملف جديد (غير الذي حفظت عليه البيانات السابقة ) ثم تقوم بدمج هذه الملفات يدوياً ..

لاستخدام ملف جديد في كل مرة .. إما أن تغير اسم الملف ضمن الكود قبل كل تشغيل .. أو تستخدم JFileChooser لانتقاء الملف في زمن التشغيل ..

الحل الثاني : في حالة رغبت باستخدام نفس الملف دائماً .. عندها ينبغي لبرنامجنا أن يقوم عند تشغيله بقراءة الملف المحفوظ سابقاً و أخذ البيانات المسجلة فيه بعين الاعتبار .. و للقيام بذلك أقترح التالي :

ننشئ صف جديد لنسمه Verb يحوي على عنصرين من نمط String هما ArabicVerb و EnglishTranslate

مع الباني المناسب و إجرائات الإسناد و الاسترجاع المناسبة (setters & getters) :

public class Verb {
	String ArabicVerb; 
	String EnglishTranslate;

	public Verb(String arabicVerb, String englishTranslate) {
		ArabicVerb = arabicVerb;
		EnglishTranslate = englishTranslate;
	}

	public String getArabicVerb() {
		return ArabicVerb;
	}

	public void setArabicVerb(String arabicVerb) {
		ArabicVerb = arabicVerb;
	}

	public String getEnglishTranslate() {
		return EnglishTranslate;
	}

	public void setEnglishTranslate(String englishTranslate) {
		EnglishTranslate = englishTranslate;
	}		

	public String toString(){
		return ArabicVerb +"  ---->  "+EnglishTranslate;
	}

}

و نقوم بتعريف شعاع Vector ( أو قائمة ArrayList ) من النمط Verb .. بهدف تخزين البيانات ضمنه ..

الآن عند تشغيل البرنامج و قراءة الملف سنقوم بتخزين نسخة من البيانات ضمن هذا الشعاع من الـ Verb ..

و عند إدخال بيانات جديدة تتم إضافتها إلى هذا الشعاع .. و أخيراً عند حفظ الملف سيتم نقل البيانات من الشعاع إلى المستند و من ثم إلى الملف ..

أبو خالد السوري

#9

قراءة الملف :

بدلاً من قراءة ملفات XML باستخدام DOM أو SAX أفضل عادة استخدام JDOM وذلك لبساطتها و سهولة فهمها مقارنة مع غيرها من مفسرات XML .

يمكنك تنزيل JDOM من موقعها الرسمي : http://www.jdom.org/

السطران التاليان يكفيان لقراءة الملف و إنشاء المستند منه :

FileReader fileReader = new FileReader("VerbDB.xml");
Document document = new SAXBuilder().build(fileReader);

و من ثم نحصل على العقدة الجذر من خلال :

root = document.getRootElement();

الآن قراءة البيانات و تسجيلها في الشعاع ستتم من خلال الإجرائية التالية :

public Vector<Verb> getVerbs(){
	Vector<Verb> verbs = new Vector<Verb>();
	List verbsList = root.getChildren("Verb");
	for(int i=0;i<verbsList.size();i++){
		Element verbElem = (Element) verbsList.get(i);
		String ArabicVerb = verbElem.getChild("ArabicVerb").getTextTrim();
		String EnglishTranslate = verbElem.getChild("EnglishTranslate").getTextTrim();
		Verb verb = new Verb(ArabicVerb,EnglishTranslate);
		verbs.addElement(verb);
	}		
	return verbs;
}

الشرح : العقدة الجذر (Verbs) كانت تحوي على مجموعة من العقد الأبناء (Verb) و التعليمة :

root.getChildren("Verb");

كفيلة باسترجاع جميع هذه الأبناء و تسجيلها في قائمة (List) من العقد ..

من خلال حلقة for نقوم بالمرور على عناصر هذه القائمة و عند كل عنصر (Element) منها نسترجع ابنيه :

العقدتين : ArabicVerb و EnglishTranslate باستخدام getChild و من هذه العقد نأخذ النص المضمن فيهما باستخدام getTextTrim ..

انطلاقاً من هاذين النصين ننشئ غرضاً من النمط Verb الذي أنشأناه سابقاً ..

بقي أن نضيف هذا الغرض إلى الشعاع ..

النص الكامل للصف VerbXMLReader :

import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import java.util.Vector;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class VerbXMLReader {

	Element root;
	Vector<Verb> verbs = new Vector<Verb>();

	public VerbXMLReader() {
		try {
			FileReader fileReader = new FileReader("VerbDB.xml");
			Document document = new SAXBuilder().build(fileReader);
			root = document.getRootElement();				
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} catch (JDOMException e) {
			System.out.println(e.getMessage());
		}
	}	

	public Vector<Verb> getVerbs(){
		Vector<Verb> verbs = new Vector<Verb>();
		List verbsList = root.getChildren("Verb");
		for(int i=0;i<verbsList.size();i++){
			Element verbElem = (Element) verbsList.get(i);
			String ArabicVerb = verbElem.getChild("ArabicVerb").getTextTrim();
			String EnglishTranslate = verbElem.getChild("EnglishTranslate").getTextTrim();
			Verb verb = new Verb(ArabicVerb,EnglishTranslate);
			verbs.addElement(verb);
		}		
		return verbs;
	}

}

أبو خالد السوري

#10

الآن أصبح بمقدورنا أن نستخدم هذا القارئ عند تهيئة الواجهة (تشغيل البرنامج) من أجل قراءة البيانات من ملف XML و تسجيلها في شعاع

اقتباس
Vector<Verb>

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

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

السبب الذي من أجله استخدمنا الشعاع .. هو أن البيانات ستكون مخزنة في الذاكرة دوماً مما يوفر في عمليات القراءة و الكتابة إلى الملف .. كما أنه يمكننا معالجة البيانات بسهولة .. مثل فرز البيانات , حذف بيان معين, البحث عن بيان معين, التحقق من التكرار ... الخ.

أخيراً لا بد أن أشير إلى التعديلات التي ينبغي إضافتها إلى الصفين MainFrame و VerbXMLWriter لكي تتوافق مع الطريقة الجديدة ..

في الصف VerbXMLWriter سيلزمنا إجرائيتان جديدتان فقط :

الأولى من أجل إضافة غرض من النمط Verb إلى المستند ..

public void addVerb(Verb verb) {
	addVerb(verb.getArabicVerb(), verb.getEnglishTranslate());
}

لاحظ أن هذه الإجرائية تستخدم سابقتها addVerb التي تقبل وسيطين من نمط String (معرفة سابقاً) .

و الثانية من أجل تفريغ (dump) كامل الشعاع في المستند :

public void dump(Vector<Verb> verbs){
	for (int i = 0; i < verbs.size(); i++) {
		addVerb(verbs.get(i));
	}
}

أما في الصف MainFrame فأولاً سنضيف القارئ و الشعاع كأعضاء عامة :

public class MainFrame extends JFrame implements ActionListener{

	Vector<Verb> verbs = new Vector<Verb>();
	VerbXMLReader reader;
	VerbXMLWriter writer;
	...
}

ثم في الباني سنهيئ القارئ و نطلب منه قراءة بيانات الملف ..

public MainFrame() {
	javax.swing.SwingUtilities.invokeLater(new Runnable() {
		public void run() {
			writer = new VerbXMLWriter(); 
			reader = new VerbXMLReader();
			verbs = reader.getVerbs();
			createAndShowGUI();
		}
	});
}

أخيراً في الإجرائية actionPerformed في القسم الخاص بزر الإدخال btnAddVerb سنستبدل العبارة :

writer.addVerb(arabicVerb, englishTranslate);

بالعبارة التالية :

verbs.addElement(new Verb(arabicVerb, englishTranslate));

و في القسم الخاص بزر الحفظ سنضيف :

writer.dump(verbs);

لتصبح الإجرائية بالكامل :

public void actionPerformed(ActionEvent e){
	Object source = e.getSource();
	if(source == btnAddVerb){
		String arabicVerb = txtArabicVerb.getText();
		String englishTranslate = txtEnglishTranslate.getText();
		verbs.addElement(new Verb(arabicVerb, englishTranslate));
		clear();
	} else if(source == btnSaveFile){
		writer.dump(verbs);
		writer.writeToFile();
	}
}

أتمنى أن تكون المشكلة قد حلت أخيراً ..

أبو خالد السوري

#11

اخي الكريم ابو خالد

لا اجد كلمة اوفيك حقك بها غير اني ادعوا الله لك ان يوفقك الله لما يحب ويرضى وان يحفظك بحفظه

غفر الله لك ولوالديك

اخي الكريم سوف اقوم بتجربه كل هذه الشروح الممتعه

وسوف ارد عليك حينما انتهي تماما

#12
أبو خالد السوري كتب:
و لكن المشكلة تكمن في أنه عند إغلاق البرنامج .. و إعادة تشغيله .. ستتم تهيئة المستند من جديد .. و هذا يعني أنه عند أول حفظ للملف ستمحى البيانات التي أدخلتها في المرة السابقة .. و عليك أن تبدأ بإدخال البيانات من جديد ..

الحل الثاني : في حالة رغبت باستخدام نفس الملف دائماً .. عندها ينبغي لبرنامجنا أن يقوم عند تشغيله بقراءة الملف المحفوظ سابقاً و أخذ البيانات المسجلة فيه بعين الاعتبار .. و للقيام بذلك أقترح التالي :

ننشئ صف جديد لنسمه Verb يحوي على عنصرين من نمط String هما ArabicVerb و EnglishTranslate

مع الباني المناسب و إجرائات الإسناد و الاسترجاع المناسبة (setters & getters) :

public class Verb {
	String ArabicVerb; 
	String EnglishTranslate;

	public Verb(String arabicVerb, String englishTranslate) {
		ArabicVerb = arabicVerb;
		EnglishTranslate = englishTranslate;
	}

	public String getArabicVerb() {
		return ArabicVerb;
	}

	public void setArabicVerb(String arabicVerb) {
		ArabicVerb = arabicVerb;
	}

	public String getEnglishTranslate() {
		return EnglishTranslate;
	}

	public void setEnglishTranslate(String englishTranslate) {
		EnglishTranslate = englishTranslate;
	}		

	public String toString(){
		return ArabicVerb +"  ---->  "+EnglishTranslate;
	}

}

و نقوم بتعريف شعاع Vector ( أو قائمة ArrayList ) من النمط Verb .. بهدف تخزين البيانات ضمنه ..

الآن عند تشغيل البرنامج و قراءة الملف سنقوم بتخزين نسخة من البيانات ضمن هذا الشعاع من الـ Verb ..

و عند إدخال بيانات جديدة تتم إضافتها إلى هذا الشعاع .. و أخيراً عند حفظ الملف سيتم نقل البيانات من الشعاع إلى المستند و من ثم إلى الملف ..

الان هذه هي مشكلتي فعلا

وقد نفذت كل الخطوات في مداخلاتك السابقه ولكن بطريقه مختلفه نوعا ما عن ما كتبته اخي ابوخالد ليناسب البرنامج الذي اقوم بعمله

ولكن الان المشكله اني اخترت الحل الثاني وهو

اقتباس
الحل الثاني : في حالة رغبت باستخدام نفس الملف دائماً .. عندها ينبغي لبرنامجنا أن يقوم عند تشغيله بقراءة الملف المحفوظ سابقاً و أخذ البيانات المسجلة فيه بعين الاعتبار

لم افهم هذه النقطه بشكل واضح

اقتباس
و نقوم بتعريف شعاع Vector ( أو قائمة ArrayList ) من النمط Verb .. بهدف تخزين البيانات ضمنه ..

الآن عند تشغيل البرنامج و قراءة الملف سنقوم بتخزين نسخة من البيانات ضمن هذا الشعاع من الـ Verb ..

و عند إدخال بيانات جديدة تتم إضافتها إلى هذا الشعاع .. و أخيراً عند حفظ الملف سيتم نقل البيانات من الشعاع إلى المستند و من ثم إلى الملف ..

كيف ساكتب في الشعاع البيانات الجديده ؟

#13

عند الضغط على زر الإدخال تتم قراءة محتويات مربعات النصوص و إنشاء غرض (كائن) من النمط Verb من هذه المحتويات ..

هذا الغرض تتم إضافته إلى نهاية الشعاع باستخدام addElement

String arabicVerb = txtArabicVerb.getText();
String englishTranslate = txtEnglishTranslate.getText();
Verb verb = new Verb(arabicVerb, englishTranslate);
verbs.addElement(verb);

الرسم التالي قد يساعد في توضيح آلية عمل البرنامج بالكامل :

post-152370-1205436372_thumb.png

تم تعديل هذه المشاركة بواسطة أبو خالد السوري في 13 مارس 2008 في 22:32

أبو خالد السوري

#14

الملف المرفق يحوي البرنامج كاملاً

VerbXML.rar

تم تعديل هذه المشاركة بواسطة أبو خالد السوري في 13 مارس 2008 في 22:47

أبو خالد السوري

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