PDA

View Full Version : ساختنXML در دلفی و خواندن آن در سی شارپ



iman_s52
دوشنبه 04 تیر 1386, 17:42 عصر
با سلام خدمت اساتید و دوستان گرامی!!!!
من میخوام حاصل یه Query تو دلفی رو به یه فایل xml انتقال بدم بعد تویه یه برنامه سی شارپ بخونمش.
واسه همین کار اومدم تو دلفی SaveToFile رو صدا زدم و فایل XML رو ساخت و تویه سی شارپ یه DataSet ساختم و همون قایل رو با ReadXML باز کردم ولی خطا میده .
نمی دونم اصلا همچین چیزی ممکن هست یا نه ؟؟؟؟ چطور می تونم اینکار رو انجام بدم .

azmoodeh
دوشنبه 04 تیر 1386, 18:13 عصر
دوست عزیز به این علت هست که ساختار دیتاست در دلفی و سی شارپ با هم یکی نیستند . ولی اگر همین فایل رو توی خود دلفی باز کنید مشکلی پیش نمیاد . ولی از اونجایی که به صورت XML ذخیره میشه پس از استاندارد لازم برای واکشی داده ها برخوردار هست.
خودتون یک کلاس توی دات نت بنویسید که فایل رو بخونه و با استفاده از کلاسهای موجود توی System.Xml اطلاعات رو بازیابی و به یک دیتاست تبدیل کنه

iman_s52
دوشنبه 04 تیر 1386, 18:21 عصر
یعنی هیچ راهی نیست که نخوام درگیر کد نویسی بشم آخه یه کم عجله دارم .

azmoodeh
دوشنبه 04 تیر 1386, 18:26 عصر
دقیقا نمی دونم . ولی اگر می خواید فایل Xml ای که توی دلفی تولید می کنید بزارید تا ساختارش رو نگاه کنیم شاید از یه روش ساده و کوتاه بشه مشکل رو حل کرد.

iman_s52
دوشنبه 04 تیر 1386, 18:48 عصر
ممنون میشم اگه راهنماییم کنی .

ghafoori
دوشنبه 04 تیر 1386, 21:49 عصر
دوست عزیز با این کد می توانید این فایل را بخوانید


XmlDocument d=new XmlDocument();
XmlNodeList x;
DataTable data;
d.Load("G:\\Documents and Settings\\ali\\Desktop\\windows-1256''11\\11.xml");
x = d.GetElementsByTagName("z:row");
XmlNode xn ;
int a;
object[] b=new object[4];
For(a = 0, a <= x.Count - 1, a++){

xn = x.Item(a);
b[0]=xn.Attributes.Item(0).Value;
b[1]=xn.Attributes.Item(1).Value;
b[2]=xn.Attributes.Item(2).Value;
b[3]=xn.Attributes.Item(3).Value;
data.Rows.Add(b);
}

hdv212
دوشنبه 04 تیر 1386, 23:54 عصر
ghafoori جان من از این کد توی c# استفاده کردم، خطا میگیره.

XmlDocument d=new XmlDocument();
XmlNodeList x;
DataTable data = new DataTable();
d.Load(src);
x = d.GetElementsByTagName("z:row");
XmlNode xn;
int a;
object[] b=new object[4];
for (a = 0; a <= x.Count; a++)
{
xn = x.Item(a);
b[0] = xn.Attributes.Item(0).Value;
b[1] = xn.Attributes.Item(1).Value;
b[2] = xn.Attributes.Item(2).Value;
b[3] = xn.Attributes.Item(3).Value;
data.Rows.Add(b);
}

خطا هم اینه(در خط data.Rows.Add(b); ) :
Input array is longer than the number of columns in this table.

ghafoori
سه شنبه 05 تیر 1386, 05:27 صبح
خوب باید هم خطا بگیرد چون جدول data وجود ندارد من وقتی این کد را امتحان می کردم بجای این خط جدول مقدارها را با messagebox نشان می دادم که ببینم درسته دیدم درست کار می کند گفتم چیکار کنم دستمون گیج نشه این خط را اضافه کردم برای این که خطلا نده شما هم جدول با چهار ستون ایجاد کنید بنام دیتا خطا بر طرف می شود شما بجای این کد یک messagebox بگذارید دقیقا داده ها را یکی یکی نمایش می دهد

iman_s52
سه شنبه 05 تیر 1386, 09:12 صبح
با تشکر از لطف و توجه دوستان
حالا اگه من بخوام این اطلاعات رو بخونم و تویه گرید بخوام نشونش بدم چیکار باید بکنم ؟؟؟

azmoodeh
سه شنبه 05 تیر 1386, 09:42 صبح
کاری نداره دیگه !! کدی که آقای غفوری نوشتند رو استفاده کنید و ردیف ها رو به یک DataTable اضافه کنید و نهایتا به یک گرید Bind کنید.

iman_s52
سه شنبه 05 تیر 1386, 10:40 صبح
ممنون
حالا برعکس این کار چطوری میشه یعنی از سی شارپ به دلفی بخوام برگردونم جوری که کوئری دلفی بتونه اونو بخونه ؟؟؟

ghafoori
سه شنبه 05 تیر 1386, 12:38 عصر
این کار به راحتی انجام می شود کافی است فایل xml را خودتان بسازید چطوری ابتدا تمام کد های xml را از یک فایلی که دلفی تولید کرده داخل فایل جدید قرار دهید یعنی همان اطلاعاتی که قبل از تک z:row قرار دارند حالا شما یک حلقه ایجاد می کنید که سطر جدول را یکی یکی از جدول خوانده و بصورت تگهای z:row در بیاورد و داخل فایل قرار دهید و نهایتا تگهای بعد از تگهای z:row را داخل فایل قرار دهید من از این روش برای تولید فایلهای xml برای excel انجام دادم براحتی جواب داده فقط یکمی کد نویسی ان زیاد است

iman_s52
سه شنبه 05 تیر 1386, 12:53 عصر
ممنون از راهنماییتون
تستش میکنم !!! ممنون

hdv212
چهارشنبه 06 تیر 1386, 17:25 عصر
ghafoori جان من DataColumn ساختم و به جدولم اضافه کردم، ولی در خط
xn = x.Item(a); خطا میگیره و میگه که آبجکتی ازش ساخته نشده :
Object reference not set to an instance of an object

کد جدیدم هم اینه :


XmlDocument d = new XmlDocument();
XmlNodeList x;
DataTable data = new DataTable();
DataColumn dc1 = new DataColumn("K_Code");
DataColumn dc2 = new DataColumn("Mojodi");
DataColumn dc3 = new DataColumn("A_Code");
DataColumn dc4 = new DataColumn("c3");
data.Columns.Add(dc1);
data.Columns.Add(dc2);
data.Columns.Add(dc3);
data.Columns.Add(dc4);
d.Load(src);
x = d.GetElementsByTagName("z:row");
XmlNode xn;
int a;
object[] b = new object[4];
for (a = 0; a <= x.Count; a++)
{
xn = x.Item(a);
b[0] = xn.Attributes.Item(0).Value;
b[1] = xn.Attributes.Item(1).Value;
b[2] = xn.Attributes.Item(2).Value;
b[3] = xn.Attributes.Item(3).Value;
data.Rows.Add(b);
}
this.dataGridView1.DataSource = data;

ghafoori
چهارشنبه 06 تیر 1386, 21:15 عصر
دوست عزیز انگار شما بیشتر پیرو این قضیه هستید تا کاربر iman_s52
من همیشه برنامه می نویسم چون علاقه زیادی به وی بی دارم ابتدا برنامه هان را داخل وی بی می نویسم و اشکال زدایی می کنم بعد ان وقت کدم را به سی شارپ تبدیل می کنم چون از نحو سی شارپ خوشم نمی اید حالا تو این تبدیل من یادم رفت -1 اضافه کنم این خط را


for (a = 0; a <= x.Count; a++)

به این صورت بنویسید


for (a = 0; a <= x.Count-1; a++)

این هم کل پروژه برای hdv212 عزیز
9460

hdv212
چهارشنبه 06 تیر 1386, 22:18 عصر
ghafoori جان مشکل حل شد. دستت درد نکنه، آخه این xml خیلی مهمه، خیلی دنبالش بودم، دیدم حالا که یه نفر یادش بود پست بذاره، من ادامه ش بدم، هم من و هم بچه ها یاد بگیرن، به هر حال مرسی. دمت گرم!

iman_s52
پنج شنبه 07 تیر 1386, 00:06 صبح
ghafoori جان من هم ازت ممنونم واقعا لطف کردی

iman_s52
چهارشنبه 13 تیر 1386, 06:42 صبح
دوستان حالا من مشکلم تویه ایجاد فایل XML طیق فایل نمونه ای که گذاشته بودم .
فایل یکبار ساخته میشه و به دفعات به اون اطلاعات اضافه میشه .
ممنون میشم منو راهنمایی کنید.

iman_s52
یک شنبه 17 تیر 1386, 06:30 صبح
دوستان من هنوز مشکلم حل نشده!!!!

hdv212
یک شنبه 17 تیر 1386, 22:53 عصر
iman_s52 جان من اطلاعات شما رو در dataGridView نمایش دادم و تو همون dataGridView چند تا رکورد اضافه کردم و نتیجه رو دوباره به صورت فایل xml ذخیره کردم، این کد من جواب داد :


DataTable dt = (DataTable)this.dataGridView1.DataSource;

this.toolStripStatusLabel1.Text = "Exporting Xml ...";
Application.DoEvents();
XmlTextWriter writer = new XmlTextWriter("13.xml", ASCIIEncoding.Default);
int i;
writer.WriteStartDocument();
writer.WriteComment("This Document Created By Hamed Vaziri - 2007");
writer.WriteStartElement("root");
for (i = 0; i < this.dataGridView1.Rows.Count - 1; i++)
{
this.toolStripStatusLabel1.Text = "Exporting Record " + i.ToString();
writer.WriteStartElement("row");
writer.WriteAttributeString("K_Code", dt.Rows[i][0].ToString());
writer.WriteAttributeString("Mojodi", dt.Rows[i][1].ToString());
writer.WriteAttributeString("A_Code", dt.Rows[i][2].ToString());
writer.WriteAttributeString("c3", dt.Rows[i][3].ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
writer.Close();
this.toolStripStatusLabel1.Text = "Xml Export Done! [ Records : " + i.ToString() + " ]";

موفق باشید

iman_s52
سه شنبه 19 تیر 1386, 17:45 عصر
ممنون از راهنماییتون
تستش میکنم !!!

iman_s52
چهارشنبه 20 تیر 1386, 09:53 صبح
hdv212 عزیز من میخوام این فایل ایجاد شده به همون فرمت که نمونه اونو همون اولا گذاشتم بشه . چون Query دلفی فقط همون فرمت رو باز میکنه .
ولی اینی که من از روش شما ساختم رو نمی تونه باز کنه ... چکار کنم ؟؟؟؟؟

ghafoori
چهارشنبه 20 تیر 1386, 20:59 عصر
عزیز من میخوام این فایل ایجاد شده به همون فرمت که نمونه اونو همون اولا گذاشتم بشه . چون Query دلفی فقط همون فرمت رو باز میکنه .
ولی اینی که من از روش شما ساختم رو نمی تونه باز کنه ... چکار کنم ؟؟؟؟؟
خوب دوست عزیز معلومه جواب نمیده چون به جواب من توجه نکردید در حقیقت کاربر hdv212 این قسمت را کد ننوشته

تمام کد های xml را از یک فایلی که دلفی تولید کرده داخل فایل جدید قرار دهید یعنی همان اطلاعاتی که قبل از تک z:row قرار دارن
این اطلاعات ساختار فایل xml را برای کلاس دیتا دلفی مشخص می کند و وجود انها در ابتدا فایل الزامی است برای همین من پیشنهاد میدم این ابتدا فایل را داخل resouce برنامه ذخیره کنید و به ابتدا فایل زمیمه کنید

ghafoori
چهارشنبه 20 تیر 1386, 21:31 عصر
ببینید این رنامه جواب می دهد
9651

iman_s52
پنج شنبه 21 تیر 1386, 10:52 صبح
ممنون از لطف و توجهتون
تستش میکنم !!!

iman_s52
سه شنبه 09 مرداد 1386, 11:17 صبح
بازم سلام
مشکل جدیدم اینه که من نمی خوام بصورت کلی‌(یکجا) اطلاعات رو تویه xml بریزم بلکه انتخابی دست کاربر یه کالا رو انتخاب میکنه و می خواد تعداد بده و بعد دکمه ذخیره رو بزنه اینجا اطلاعات رو میخوام بریزه به انتهای فایل .
چطور می تونم Append کنم ؟؟؟

iman_s52
چهارشنبه 10 مرداد 1386, 12:38 عصر
چطوری می تونم اینکار رو انجام بدم؟؟؟؟؟؟؟؟