View Full Version : خواندن یک فایل xml
moh.mon
دوشنبه 17 مرداد 1390, 00:24 صبح
سلام.
من یک فایل xml دارم و میخوام یه قسمت هایی از این فایل و بخونم و تو یه textbox نشون بدم.
این فایل xml هست:
http://www.mediafire.com/?xekzez5krmgdlq9
من به سه تا از بخش های اصلی(mainsection) ها نیاز دارم.
Esmail Solhkhah
دوشنبه 17 مرداد 1390, 01:10 صبح
سلام دوست عزیز
برنامشو براتون نوشتم
دقت کنید شما برا بدست آوردن فایل XSD از فایل XML به برنامه XSD.EXE نیاز دارید که معمولا تو مسیره زیره
C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin
نحوه استفاده از xsd.exe
xsd myFile.xml /outputdir:myOutputDir
موفق باشید.
moh.mon
دوشنبه 17 مرداد 1390, 09:32 صبح
سلام.
از کمکت خیلی ممنونم دوست عزیز.
ولی این به من کمکی نمیکنه. من باید با استفاده از mainsection و section به یه قسمت از xml دسترسی پیدا کنم بعدش اونو بخونم.
در ضمن فایلهای xml من زیاد هستن و با هم تفاوت دارن(از لحاظ اندازه و محل قرار گیری عناصر) به همین خاطر من باید از کلاس xmlreader استفاده کنم.
برای مثال تو فایل حرکت کنم و هر جا به mainsection با title = cpu رسیدم section مربوط به اونو بخونم و اطلاعات و تو یه پایگاه داده نمایش بدم
mehdi.mousavi
دوشنبه 17 مرداد 1390, 12:42 عصر
سلام. ولی این به من کمکی نمیکنه. من باید با استفاده از mainsection و section به یه قسمت از xml دسترسی پیدا کنم بعدش اونو بخونم. در ضمن فایلهای xml من زیاد هستن و با هم تفاوت دارن(از لحاظ اندازه و محل قرار گیری عناصر) به همین خاطر من باید از کلاس xmlreader استفاده کنم. برای مثال تو فایل حرکت کنم و هر جا به mainsection با title = cpu رسیدم section مربوط به اونو بخونم و اطلاعات و تو یه پایگاه داده نمایش بدم
سلام.
شما می تونید از W3C DOM XML API یا LINQ استفاده کنید. فرض کنید که قصد داریم به نودی برسیم که mainsection id اش 249 و section id اش 250 هستش. برای اینکار، با استفاده از LINQ میتونیم بدین شکل عمل کنیم:
string filename = "SCORPION.xml";
int mainSectionId = 249, sectionId = 250;
string xpath = string.Format("//mainsection[@id={0}]/section[@id={1}]/data", mainSectionId, sectionId);
XDocument doc = XDocument.Load(filename);
IEnumerable<XElement> xnodes = ((IEnumerable)doc.Root.XPathEvaluate(xpath)).Cast<XElement>();
foreach (XElement xnode in xnodes)
{
string dataTitle = xnode.Attribute("title").Value;
string dataValue = xnode.Value;
}
اما اگر به هر دلیلی مایل نیستید از LINQ استفاده کنید، می تونید از W3C DOM XML API ها استفاده کنید:
string filename = "SCORPION.xml";
int mainSectionId = 249, sectionId = 250;
string xpath = string.Format("//mainsection[@id={0}]/section[@id={1}]/data", mainSectionId, sectionId);
XmlDocument doc2 = new XmlDocument();
doc2.Load(filename);
XmlNodeList nodes = doc2.SelectNodes(xpath);
foreach (XmlNode node in nodes)
{
string dataTitle2 = node.Attributes["title"].Value;
string dataValue = node.InnerText;
}
بدین ترتیب، من در یک Loop نود data ی مربوط به اون mainsection/section مورد نظرم رو پیمایش می کنم و به جزییات اون میرسم.
موفق باشید.
پاورقی: با این BCL ای که در .NET تحت اختیار داریم، نیازی به استفاده از XmlReader و ... نیست.
moh.mon
دوشنبه 17 مرداد 1390, 13:13 عصر
از کمکت خیلی ممنونم.
فقط میشه این قسمت و یکم بیشتر توضیح بدین:
string xpath = string.Format("//mainsection[@id={0}]/section[@id={1}]/data", mainSectionId, sectionId);
تو این قسمت هست که نوع جستجو مشخص می کنین؟
و یه سوال دیگه میشه بگین برای Xdocument به کدوم کتابخانه نیاز داریم؟
mehdi.mousavi
دوشنبه 17 مرداد 1390, 13:50 عصر
از کمکت خیلی ممنونم. فقط میشه این قسمت و یکم بیشتر توضیح بدین:
string xpath = string.Format("//mainsection[@id={0}]/section[@id={1}]/data", mainSectionId, sectionId);
تو این قسمت هست که نوع جستجو مشخص می کنین؟ و یه سوال دیگه میشه بگین برای Xdocument به کدوم کتابخانه نیاز داریم؟
بله، نوع جستجو در این رشته که بهش XPath (http://msdn.microsoft.com/en-us/library/ms256115.aspx) میگن تعریف شده. اون دو Slash اول، یعنی از Root شروع کن، سپس به element ای که اسمش mainsection هستش برس. بعدش اون [] نشون دهنده این هستش که میخوام به دنبال یک Attribute باشم. کدوم Attribute؟ اونی که اسمش id هستش (علامت @ به همراه اون Square Bracket ها، نشون دهنده یک Attribute هستن). سپس، یک / میزنم (یعنی Child Element های mainsection) و نام element رو تعیین می کنم. مجددا چون قصد دارم به section خاصی برسم، id اش رو ذکر می کنم و در نهایت، با زدن /data خودم رو به نود data ی اون Element ها میرسونم... البته XPath پیچیدگی هایی داره، که به مرور زمان و با مطالعه میتونید به اونها پی ببرید...
XDocument نیز در System.Xml.Linq namespace قرار داره که اسمبلی مربوطه اش اینه: System.Xml.Linq.dll
موفق باشید.
پاورقی: شما به هیچ وجه مجبور نیستید از XPath هنگام استفاده از LINQ استفاده کنید. بطور مثال می تونید بدین شکل کد فوق رو نیز بنویسید:
string filename = "SCORPION.xml";
int mainSectionId = 249, sectionId = 250;
XDocument doc = XDocument.Load(filename);
XElement section = doc.Descendants("mainsection")
.Where(ms => ms.Attribute("id").Value == mainSectionId.ToString())
.Descendants("section")
.Where(s => s.Attribute("id").Value == sectionId.ToString())
.First();
string title = section.Attribute("title").Value;
foreach (XElement data in section.Descendants("data"))
{
string dataTitle = data.Attribute("title").Value;
string dataValue = data.Value;
}
یا روش های دیگه هنگام استفاده از LINQ...
moh.mon
دوشنبه 17 مرداد 1390, 18:51 عصر
از کمکت واقعا ممنون. واقغا پست هات مفید بود.
ممنون میشم در مورد این قسمت هم یه کمکی بکنی.
من میخوام IP های موجود در این xml و بخونم. ولی مشکل اینجاس که تعداد کارت شبکه و اسم اون ها مشخص نیست. میشه یکم راهنمایی کنید.
- (http://barnamenevis.org/) <section title="Adapters List">
- (http://barnamenevis.org/) <section title="Marvell Yukon 88E8036 PCI-E Fast Ethernet Controller">
<data title="IP Address">0.0.0.0</data>
<data title="Subnet mask">0.0.0.0</data>
<data title="Gateway server">192.168.1.1</data>
</section>
- (http://barnamenevis.org/) <section title="Intel(R) Wireless WiFi Link 4965AGN">
<data title="IP Address">0.0.0.0</data>
<data title="Subnet mask">0.0.0.0</data>
<data title="Gateway server">1.0.0.0</data>
</section>
</section>
من این کد و نوشتم ولی نمیدونم چه جوری برم به کارت شبکه ی بعدی؟
section = doc.Descendants("mainsection")
.Where(ms => ms.Attribute("title").Value == "Network")
.Descendants("section")
.Where(s => s.Attribute("title").Value == "Adapters List")
.Descendants("section")
.Descendants("data")
.Where(dt => dt.Attribute("title").Value == "IP Address")
.First();
textBox10.Text = section.Value;
moh.mon
دوشنبه 17 مرداد 1390, 18:58 عصر
میشه یه منبع برای مطالعه ی LINQ معرفی کنید ؟
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.