PDA

View Full Version : سوالی در مورد دی سریالایز نموندن یک فایل ایکس ام ال



MOHMMAD.M
یک شنبه 20 مرداد 1392, 05:35 صبح
سلام .
من یه کدی نوشتم که یه مقدار اینجا توضیح میدم شاید به درد کسی بخوره . چون فکر کنم کد جالبه . بعد هم سوالم رو میپرسم دوستانی که دستی بر اتش دارن لطفا کمکم کنند .

من یه فایل ایکس ام ال دارم که میخوام دیسریالایزش کنم ولی نه به روش معمول که فیلد ها و.... رو به صورت اماده تو کلاسم مخصوص به خودش داشته باشم .

مثلا معمولش اینه که چندتا فیلد مثل این پایین داشته باشی

public class pardis
{
public string name { get; set; }
public int number { get; set; }
public string City { get; set; }
private string PoAddress { get; set; }
}

همون جور که میدونید برنامه میره نام فیلد رو (مثلا name ) رو تو فایل ایکس ام ال میگرده و مقدارش رو بر میگردونه
ولی من میخوام هر سری خودم نام فیلدها رو ارسال کنم . یعنی از قبل نوشته نشده باشه و بنا به شرایط خاص نام های ( فیلد های خاص ) سرچ بشه تو فایل .
مثلا شاید در ایینده دیگه نیازی نباشه نام فلان جنس بررسی بشه و یا یک جنس جدید ثبت بشه تو برنامه میخوام وقتی این مثلا جنس جدید ثبت شد تو برنامه برنامه بتونه این جنس جدید رو به عنوان نام فیلد بفرسته و مقدارش رو برگردونه .

برای نوشتن این جوری من از توابع زیر استفاده کردم :

XmlTextWriter xmlTextWriter = new XmlTextWriter(@"C:\14.xml", ASCIIEncoding.Default);
xmlTextWriter.WriteStartDocument();
xmlTextWriter.WriteStartElement("Record");
xmlTextWriter.WriteAttributeString(textBox1.Text, textBox2.Text);
xmlTextWriter.WriteEndElement();
xmlTextWriter.WriteEndDocument();
xmlTextWriter.Close();

که تو کد های بالا
xmlTextWriter.WriteAttributeString(textBox1.Text, textBox2.Text);
یعنی نام فیلد از تکس باکس 1 و مقدار ان از تکس باکس 2 برداشته شود.
خوب همونجور که میبینید میتونم برنامه رو با فیلدهای مختلف (یعنی با هر نامی که بخوام بنویسم یعنی همون مقدار تکس باکس یک)
اما برای برگردوندنش نمیدونم باید چکار کنم

یه فایلی دارم که چند تا نام جنس رو تو خودش داره و هر سری که برنامه اجرا میشه میره اون رو دیسریالایز میکنه .
این فایل میتونه بهش اضافه شه ( چون نام اجناس هست احتمال این که جنس جدیدی اضافه شه هست پس نمیشه گفت تعداد فیلد رو هر سری من بیام اضافه کنم به برنامم و بدم بهشون برای هر جنس جدید


دوستانی که میدونن ازشون خواهش میکنم که راهنمایی کنن . با تشکر :قلب:

MOHMMAD.M
یک شنبه 20 مرداد 1392, 19:14 عصر
دوستان لطفا هر چقدر هم کم یه کمکی بکنید راه دوری نمیره

من بازم سرچ کردم به یه تیک کد برخوردم که اینجا میزارم ولی این هم کار من رو راه نمیندازه ولی فکر کنم دوستانی که حرفیی هستن میتونن کمک کنن

string str = "";

XmlTextReader XmlRdr = new XmlTextReader("AppXml.xml");

while(!XmlRdr.EOF)

{

if (XmlRdr.MoveToContent() == XmlNodeType.Element)

switch (XmlRdr.Name)

{

case "Name":

str=XmlRdr.ReadElementString();

break;

case "Familly":

str+= "\n"+ XmlRdr.ReadElementString();

break;

case "User":

str+= "\n"+ XmlRdr.ReadElementString();

break;

case "DateExp":

str+= "\n"+ XmlRdr.ReadElementString();

break;

default:

XmlRdr.Read();

break;

}

else

XmlRdr.Read();

}

parvizwpf
یک شنبه 20 مرداد 1392, 19:20 عصر
یعنی الان تو write موندی؟

MOHMMAD.M
یک شنبه 20 مرداد 1392, 20:37 عصر
نه تو خوندنش موندم !!!

می خوام بدونم چطور تو فایل ایکس ام ال سرچ کنم برای یه نام فیلد خاص مثلا تو فایلم یه فیلد به نام :

<name>
mohammad
<name/>
دارم و الیته 100 تا فیلد دیگه با نام های مختلف
میخوام بدونم با چه کدی میتونم سرچ کنم و فیلد name رو پیدا کنم و مقدارش رو برگردونم که تو این مثالی که زدم میشه mohammad

MOHMMAD.M
یک شنبه 20 مرداد 1392, 20:46 عصر
یعنی الان تو write موندی؟

والبته میخوام خودم name رو وارد کنم
یعنی مقدار فیلد جستجو رو خودم وارد کنم
چیزی به ذهنت میرسه ؟؟

plus
یک شنبه 20 مرداد 1392, 20:50 عصر
شما میتونید از متد SelectNodes یا SelectNode مربوط به XmlDocument استفاده کنید.این مثال رو از اینجا (http://www.csharp-examples.net/xml-nodes-by-name/) آوردم:

XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString); // suppose that myXmlString contains "<Names>...</Names>"

XmlNodeList xnList = xml.SelectNodes("/Names/Name");
foreach (XmlNode xn in xnList)
{
string firstName = xn["FirstName"].InnerText;
string lastName = xn["LastName"].InnerText;
Console.WriteLine("Name: {0} {1}", firstName, lastName);
}

در یک XmlDocument هم Node ها هر کدوم یک آدرسی دارن، شما باید، با استفاده از XPath، آدرس Node یا Node هایی که میخواین رو بدین تا بدونین اونها رو واکشی کنین.در این مثال، یک XPath خیلی ساده استفاده شده که میگه Node هایی که زیر شاخه اصلی Names و با نام Name هستند رو برگردون.
یک Document برای این مثال بالا میتونه این باشه:

<?xml version="1.0" encoding="utf-8"?>
<Names>
<Name>
<FirstName>Ali</FirstName>
<LastName>Rezai</LastName>
</Name>
<Name>
<FirstName>Mohammad</FirstName>
<LastName>Ahmadi</LastName>
</Name>
</Names>

MOHMMAD.M
دوشنبه 21 مرداد 1392, 22:04 عصر
با تشکر از plus عزیز برای راهنمایی و قرار دادن کد.
بهتر دونستم نتیجه رو بزارم اینجا شاید کسی بدردش خورد .:لبخندساده:

با یه مقدار تغییر کدهای کامنت بالا به این نتیجه رسیدم :

dataGridView1.Rows.Clear();
XmlDocument xml = new XmlDocument();
xml.Load(@"C:\14.xml");

for (int i = 1; i < listBox3.Items.Count; i++)
{
XmlNodeList xnList = xml.SelectNodes("root/" + textBox2.Text);//listBox3.Items[i].ToString());
foreach (XmlNode xn in xnList)
{
string[] rows = { listBox3.Items[i].ToString(), xn.InnerText.ToString() };
dataGridView1.Rows.Add(rows);
}
}


که با این کد برنامه یکی یکی ایتم های لیست باکس رو میبره و مقایسه میکنه با فایل ایکس ام ال اگر المنتی وجود داشت وقدارش رو بر میگردونه . اگر نه که نه .

MOHMMAD.M
دوشنبه 21 مرداد 1392, 22:07 عصر
این هم خروجیش بود که من از این خروجی اطلاعات رو استخراج کردم با کد بالا :

<?xml version="1.0" encoding="utf-8" ?>
- <root>
<name>mohammad</name>
<age>27</age>
</root>