PDA

View Full Version : مشکل در خواندن اطلاعات Linq to XML



NIMA_1981
شنبه 29 بهمن 1390, 11:22 صبح
سلام دوستان
من یک فایل xml دارم به این شکل

<?xml version="1.0" encoding="utf-8" ?>
<quran type="metadata" version="1.0" copyright="www.quran.ru" license="cc-by">
<suras alias="chapters">
<sura index="1" ayas="7" start="0" name="الفاتحة" tname="Al-Faatiha" ename="The Opening" type="Meccan" order="5" rukus="1" />
<sura index="2" ayas="286" start="7" name="البقرة" tname="Al-Baqara" ename="The Cow" type="Medinan" order="87" rukus="40" />
</suras>


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


var quran = from m in XElement.Load(Server.MapPath("quran-data.xml")).Descendants("sura")
select new
{
name= (string)m.Element("name").Value,
ename = (string)m.Element("ename").Value

};

GridView1.DataSource = quran;
GridView1.DataBind();

اما برنامه این خطا رو مید
82868
با تشکر

mehdi.mousavi
شنبه 29 بهمن 1390, 11:55 صبح
سلام.
جای Element در کد فوق باید بنویسید Attribute و مشکل رفع میشه:

select new
{
name = (string)m.Attribute("name").Value,
ename = (string)m.Attribute("ename").Value
};


موفق باشید.

NIMA_1981
شنبه 29 بهمن 1390, 14:27 عصر
مرسی درست شد - میشه یک توضیح هم در مورد Attribute بدید جه فرقی داره با Element

mehdi.mousavi
شنبه 29 بهمن 1390, 14:48 عصر
مرسی درست شد - میشه یک توضیح هم در مورد Attribute بدید جه فرقی داره با Element

سلام.
در XML، شما می تونید داده ها رو در Child Element ها نگهداری کنید، یا اونها رو بصورت خصائص یک Element تعریف کنید. فرض کنید قصد داریم اطلاعات یک Person رو در XML نگهداری کنیم. در حالت اول و با استفاده از Child Element ها، میتونیم بدین شکل عمل کنیم:

<Person>
<Firstname>Mehdi</Firstname>
<Lastname>Mousavi</Lastname>
</Person>


در این مثال، Firstname، Lastname و Person رو Element میگیم. اما همین اطلاعات رو می تونم بدین شکل نیز در XML نگهداری کنیم:

<Person firstname="Mehdi" lastname="Mousavi" />

در این مثال، Person المنت و firstname و lastname هر دو Attribute های اون Element هستن... از اونجاییکه در کد شما، name و ename هر دو attribute های المنت sura بودن، پس باید موقع خوندن از متود Attribute استفاده می کردید. کد شما باعث میشد تا XML Parser فکر کنه که شما Child Element ای به اسم name و ename زیر sura داشته اید، در نتیجه، مقدار null برمیگشت (چون sura این دو Element رو نداشت، بلکه این دو attribute های sura بودن). حالا ممکنه بپرسید کی باید از attribute و کی باید از element ها استفاده کرد. این سوال نیز قبلا در این آدرس (http://www.w3schools.com/dtd/dtd_el_vs_attr.asp) پاسخ داده شده.

موفق باشید.

NIMA_1981
شنبه 29 بهمن 1390, 17:50 عصر
مرسی -واقعا توضیح کاملی بود-
من 2 تا سوال دیگه هم دارم اگاه میشه راهنمایی کنید
1- ایا linq to text هم داریم و جطوری میتونم استفاده کنم
2- در همین مثال بالا اگه تو برنامه من بخوام به اطلاعات یک خط درستری داشته باشم باید جطوری این کار و بکنم
مثال اگه index=1 رو میزنم الفاتحه رو به من نشون بده

با تشکر

mehdi.mousavi
یک شنبه 30 بهمن 1390, 10:18 صبح
مرسی -واقعا توضیح کاملی بود-
من 2 تا سوال دیگه هم دارم اگاه میشه راهنمایی کنید
1- ایا linq to text هم داریم و جطوری میتونم استفاده کنم
2- در همین مثال بالا اگه تو برنامه من بخوام به اطلاعات یک خط درستری داشته باشم باید جطوری این کار و بکنم
مثال اگه index=1 رو میزنم الفاتحه رو به من نشون بده

با تشکر


سلام.
1. متوجه منظورتون نمیشم، لطفا بفرمایید دقیقا چی مد نظرتون هستش.
2. برای اینکار به روش های متفاوتی میشه عمل کرد. من دو روش رو ذکر می کنم:

روش اول:

string path = "d:\\temp.xml";
XElement sura = XElement.Load(path).Descendants("sura").Where(e => e.Attribute("index").Value == "1").SingleOrDefault();

روش دوم (با استفاده از XPath ها):

string path = "d:\\temp.xml";
XElement sura = XDocument.Load(path).XPathSelectElement("//quran/suras/sura[@index=1]");

موفق باشید.