PDA

View Full Version : چهار عمل اصلی در دیتابیس xml



negar.rafie
یک شنبه 23 تیر 1392, 17:50 عصر
سلام دوستان
میخواستم نحوه ی ایجاد دیتابیس xml را توضیح بدید و نحوه ی ایجاد جدول و فیلد و چهار عمل درج،حذف؛بروزرسانی و جستجو

danialafshari
یک شنبه 23 تیر 1392, 19:01 عصر
http://barnamenevis.org/showthread.php?376414-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-xml-%D9%88-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%A7%D9%86-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D8%AF%D8%B1-15-%D9%85%DB%8C%D9%86-D

negar.rafie
یک شنبه 23 تیر 1392, 20:42 عصر
اینا دیده بودم ولی درمورد جول و فیلد چیزی نگفته
بعدش وقتی یه رکورد جدید اضافه میکنم قبلیه پاک میشه

13601360
یک شنبه 23 تیر 1392, 20:49 عصر
این مثال رو قبلا با VS2008 نوشته بودم
امیدوارم کمکتون کنه

negar.rafie
یک شنبه 23 تیر 1392, 21:08 عصر
ایا در xml چیزی به اسم جدول مثل sql وجود داره؟

Mahmoud.Afrad
یک شنبه 23 تیر 1392, 22:40 عصر
نه به اونصورت. در xml با node(گره)ها کار میکنید.

negar.rafie
دوشنبه 24 تیر 1392, 09:55 صبح
من نمیخوام از linq استفاده کنم میشه روش دیگه را بگید مثلا EF بیا . . .

ghamgin
دوشنبه 24 تیر 1392, 10:20 صبح
سلام
من یک فایل xml با نود های ایدی و نام و فامیل و سن و جنس و تلفن دارم
توی ذخیره اطلاعات در این فرم مشکلی ندارم
اما می خوام وقتی کاربر در تکس باکس ایدی رو وارد میکنه مثلا 3 اطلاعات مربوط به اون ایدی از فایل xml حذف بشه در ضمن از گرید هم استفاده نکردم
و
اینکه بتونم تمام اطلاعات یکی مونده به اخر رو (شامل ایدی و نام و فامیل و جنس و سن ) که در فایل xml ذخیره شه رو در تکس باکس ها لود کنم
ممنون میشم کمکم کنید

negar.rafie
دوشنبه 24 تیر 1392, 11:59 صبح
راستش من میتونم ذخیره کنم ولی برای بار دوم قبلیا پاک میشه و جایگزین میشه یعنی یک نود بیشتر نمیتونم درج کنم مشکل کجاست
اینم کدم

XmlTextWriter XmlWrt = new XmlTextWriter("my database.xml", System.Text.Encoding.UTF8);
XmlWrt.Formatting = Formatting.Indented;
XmlWrt.WriteStartDocument();
XmlWrt.WriteStartElement("", textBox1.Text);
XmlWrt.WriteElementString("Name", textBox2.Text);
XmlWrt.WriteElementString("Familly", textBox3.Text);
XmlWrt.WriteElementString("age", textBox4.Text);
XmlWrt.WriteEndElement();
XmlWrt.WriteEndDocument();
XmlWrt.Close();

danialafshari
دوشنبه 24 تیر 1392, 17:33 عصر
راستش من میتونم ذخیره کنم ولی برای بار دوم قبلیا پاک میشه و جایگزین میشه یعنی یک نود بیشتر نمیتونم درج کنم مشکل کجاست
اینم کدم

XmlTextWriter XmlWrt = new XmlTextWriter("my database.xml", System.Text.Encoding.UTF8);
XmlWrt.Formatting = Formatting.Indented;
XmlWrt.WriteStartDocument();
XmlWrt.WriteStartElement("", textBox1.Text);
XmlWrt.WriteElementString("Name", textBox2.Text);
XmlWrt.WriteElementString("Familly", textBox3.Text);
XmlWrt.WriteElementString("age", textBox4.Text);
XmlWrt.WriteEndElement();
XmlWrt.WriteEndDocument();
XmlWrt.Close();

مگر درون سورس بالا این کار ها رو انجام نمیده؟ خب نمونه بگیرید

Mahmoud.Afrad
دوشنبه 24 تیر 1392, 18:09 عصر
برای اضافه کردن ابتدا باید کل سند را لود کنید، بعد بهش اضافه کنید و ذخیره کنید.
مثال(ثبت مشخصات فردی):

string xmlPath = Path.Combine(Application.StartupPath, "MyDatabase.xml");
XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode = null;

if (File.Exists(xmlPath))
{
xmlDoc.Load(xmlPath);
rootNode = xmlDoc.DocumentElement;
}
else
{
rootNode = xmlDoc.CreateElement("Root");
xmlDoc.AppendChild(rootNode);
}

XmlNode personNode = xmlDoc.CreateNode(XmlNodeType.Element, "Person", null);
XmlNode nameNode = xmlDoc.CreateNode(XmlNodeType.Element, "Name", null);
XmlNode famillyNode = xmlDoc.CreateNode(XmlNodeType.Element, "Familly", null);
XmlNode ageNode = xmlDoc.CreateNode(XmlNodeType.Element, "Age", null);


nameNode.InnerText = textBox1.Text;
famillyNode.InnerText = textBox2.Text;
ageNode.InnerText = textBox3.Text;

personNode.AppendChild(nameNode);
personNode.AppendChild(famillyNode);
personNode.AppendChild(ageNode);

rootNode.AppendChild(personNode);

xmlDoc.Save(xmlPath);

negar.rafie
دوشنبه 24 تیر 1392, 22:30 عصر
ممنون
من از کد زیر برای حذف استفاده میکنم ایا مشکلی نداره

XmlDocument doc = new XmlDocument();
doc.Load("my database.xml");
XmlElement elmRoot = doc.DocumentElement;
string xPath = "/Root/Person[@code='"+textBox10.Text+"']";
XmlNode findnode = elmRoot.SelectSingleNode(xPath);
if(findnode!=null )
elmRoot.RemoveChild(findnode);
doc.Save("my database.xml");

بعد کد ویرایش و جستجو و لود کردن داخل گریدویو را میشه بزارید

Mahmoud.Afrad
سه شنبه 25 تیر 1392, 20:39 عصر
کدهای زیر براساس پست قبلیم هست.
برای جستجو هم فرقی نداره. بهتره یک کلاس ایجاد کنی تا با ایجاد یک شئ از آن اطلاعات رو در اون بریزید و اونو هم در یک لیست ذخیره کنید و لیست رو به دیتاگریدویو بدید.

class Person
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}

string familly;
public string Familly
{
get { return familly; }
set { familly = value; }
}

UInt16 age;
public UInt16 Age
{
get { return age; }
set { age = value; }
}
}

فرض کنید اشخاصی رو میخواهیم که سن آنها بین 20 تا 30 هست:

string xmlPath = Path.Combine(Application.StartupPath, "MyDatabase.xml");
XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode;

if (File.Exists(xmlPath))
{
xmlDoc.Load(xmlPath);
rootNode = xmlDoc.DocumentElement;
}
else
{
MessageBox.Show("File is not exist!");
return;
}

XmlNodeList personNodes = xmlDoc.GetElementsByTagName("Person");
List<Person> personList = new List<Person>();
foreach (XmlNode node in personNodes)
{
string ageStr = node["Age"].InnerText;
if (!string.IsNullOrWhiteSpace(ageStr))
{
UInt16 age = Convert.ToUInt16(ageStr);

if (age >= 20 && age <= 30)
{
Person p = new Person()
{
Name = node["Name"].InnerText,
Familly = node["Familly"].InnerText,
Age = age
};

personList.Add(p);
}
}
}

dataGridView1.DataSource = personList;


برای حذف به اینصورت:

XmlNodeList personNodes = xmlDoc.GetElementsByTagName("Person");
if (personNodes.Count > 0)
{
for (int i = personNodes.Count - 1; i >= 0; i--)
{
XmlNode node = personNodes[i];
string name = node["Name"].InnerText;
string familly = node["Familly"].InnerText;
string age = node["Age"].InnerText;

if (name == textBox1.Text && familly == textBox2.Text && age == textBox3.Text)
{
rootNode.RemoveChild(node);
break;
}
}

xmlDoc.Save(xmlPath);
}


برای آپدیت هم مشابه همینه منتها به جای حذف باید InnerText رو تغییر بدید.
فرض کنید نام و فامیل رو داریم و میخواهیم سن رو آپدیت کنیم:

XmlNodeList personNodes = xmlDoc.GetElementsByTagName("Person");

foreach(XmlNode node in personNodes)
{
string name = node["Name"].InnerText;
string familly = node["Familly"].InnerText;
if (name == textBox1.Text && familly == textBox2.Text)
{
node["Age"].InnerText = textBox3.Text;
break;
}
}

xmlDoc.Save(xmlPath);

ghamgin
چهارشنبه 26 تیر 1392, 09:16 صبح
سلام
من یک فایل xml با نود های ایدی و نام و فامیل و سن و جنس و تلفن دارم
توی ذخیره اطلاعات در این فرم مشکلی ندارم
اما می خوام وقتی کاربر در تکس باکس ایدی رو وارد میکنه مثلا 3 اطلاعات مربوط به اون ایدی از فایل xml حذف بشه در ضمن از گرید هم استفاده نکردم
و
اینکه بتونم تمام اطلاعات یکی مونده به اخر رو (شامل ایدی و نام و فامیل و جنس و سن ) که در فایل xml ذخیره شه رو در تکس باکس ها لود کنم
ممنون میشم کمکم کنید

سلام
کسی نیست منو راهنمایی کنه؟؟؟؟
ممنون میشم...

negar.rafie
چهارشنبه 26 تیر 1392, 12:11 عصر
جواب هر دوتا سوال شما در کد حذف موجود است

ghamgin
چهارشنبه 26 تیر 1392, 18:16 عصر
جواب هر دوتا سوال شما در کد حذف موجود است

سلام
ممنونم از راهنماییت
من کد حذف رو این جوری نوشتم
اما روی خط
rootNode.RemoveChild(node);
این خطا رو میده
Use of unassigned local variable 'rootNode'
نمیدونم چطوری حلش کنم؟؟؟
ممنون میشم راهنمایی کنید..و
چطور با دادن ایدی رکورد یکی مونده به قبلش رو در تکس باکس ها لود کنم؟؟؟

string xmlPath = Path.Combine(Application.StartupPath, "MyDatabase1.xml");
XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode;

XmlNodeList personNodes = xmlDoc.GetElementsByTagName("Person");

for (int i = personNodes.Count - 1; i >= 0; i--)
{

XmlNode node = personNodes[i];
string name = node["Name"].InnerText;
string familly = node["Familly"].InnerText;
string age = node["Age"].InnerText;

if (name == textBox1.Text && familly == textBox2.Text && age == textBox3.Text)
{
rootNode.RemoveChild(node);

break;
}
}

xmlDoc.Save(xmlPath);

Mahmoud.Afrad
جمعه 28 تیر 1392, 10:45 صبح
این خطا رو میده
Use of unassigned local variable 'rootNode'

باور کن اگر متن خطا رو برای خودت ترجمه کنی میفهمی مشکل چیه.


باید یه مقدار اولیه به متغیر محلی rootNode بدی:XmlNode rootNode = null;

ghamgin
جمعه 28 تیر 1392, 11:08 صبح
باور کن اگر متن خطا رو برای خودت ترجمه کنی میفهمی مشکل چیه.


باید یه مقدار اولیه به متغیر محلی rootNode بدی:XmlNode rootNode = null;

گلم من که مثل شما حرفه ای نیستم..
الان این خطا رو با زدن باتن حذف میده
Invalid XML document. The document does not have a root element.

ghamgin
جمعه 28 تیر 1392, 11:14 صبح
break point زدم
مشکل اینه که با وجود ایتم های زیادی که درفایل xml دارم
اما در کد
for (int i = personNodes.Count - 1; i >= 0; i--)
i رو منفی یک میده
مشکل چیه؟؟؟

Mahmoud.Afrad
جمعه 28 تیر 1392, 19:45 عصر
حلقه رو بزار داخل یک if چک کن تعداد بزرگتر از 0 باشه. کد حذف رو اصلاح کردم دوباره ببین.

ghamgin
شنبه 29 تیر 1392, 09:38 صبح
بازم همون خطا رو میده
انگار بی تاثیره..
؟؟؟
ممنون