PDA

View Full Version : جست و جو در فایل XML



Hussein39
پنج شنبه 17 شهریور 1390, 11:20 صبح
سلام دوستان یه فایل XML که به صورت زیره

<?xml version="1.0" encoding="utf-8"?>
<Harkatha>
<Harkat>
<Year>2011</Year>
<Month>9</Month>
<Day>7</Day>
<Time>18:8</Time>
<BusType />
<DriverId />
<Passengers>
<Family>راد فر</Family>
<Family>راد فر</Family>
<Family>کاظمی</Family>
<Family>کاظمی</Family>
<Family>کاظمی</Family>
<Family>رضایی</Family>
<Family>رضایی</Family>
<Family>رضایی</Family>
<Family>رضایی</Family>
<Family>رضایی</Family>
<Family>رضایی</Family>
<Family>حمیدی</Family>
<Family>حمیدی</Family>
<Family>حمیدی</Family>
<Family>عسگری</Family>
<Family>عسگری</Family>
<Family>عسگری</Family>
<Family>عسگری</Family>
<Family>عسگری</Family>
<Family>عسگری</Family>
<Family>عسگری</Family>
</Passengers>
</Harkat>
</Harkatha>

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

void SecondWayXMLReaders(ref DateTime Go_Date,ref DateTime Times,ref string family)
{
XmlReader Readers = XmlReader.Create("D:\\Harkat.xml");
while ( Readers.ReadToFollowing("Family"))
{

if (Readers.ReadInnerXml() == family)
{
family = Readers.ReadInnerXml();
}

}
Readers.Close();
}

mehdi.mousavi
پنج شنبه 17 شهریور 1390, 13:21 عصر
سلام.
با این همه امکانات عجیب و غریب در BCL، دیگه نیازی به استفاده از XmlReader ندارید (مگر در مواردی خاص). شما براحتی می تونید با کد زیر، تاریخ مربوط به یک Family Name در Passengers رو (تحت قالب DateTime) بدست بیارید:


string path = "temp.xml";
string familyName = "کاظمی";

XElement element = XElement.Load(path);
string xpath = string.Format("//Passengers/Family[text()=\"{0}\"]/../..", familyName);
var coll = element.XPathSelectElements(xpath).Select(e => new
{
Date = new DateTime(int.Parse(e.Element("Year").Value), int.Parse(e.Element("Month").Value), int.Parse(e.Element("Day").Value))
}).ToList();


و در نتیجه، در یک حلقه، به Date مربوطه دسترسی پیدا کنید:


foreach (var item in coll)
{
//item.Date
}


اگر نمی تونید از LINQ استفاده کنید، میتونید همین کد رو بسادگی با W3C XML DOM API ها باز نویسی کنید.

موفق باشید.