PDA

View Full Version : خواندن یک فایل xml



moh.mon
یک شنبه 16 مرداد 1390, 23:24 عصر
سلام.
من یک فایل xml دارم و میخوام یه قسمت هایی از این فایل و بخونم و تو یه textbox نشون بدم.
این فایل xml هست:
http://www.mediafire.com/?xekzez5krmgdlq9
من به سه تا از بخش های اصلی(mainsection) ها نیاز دارم.

Esmail Solhkhah
دوشنبه 17 مرداد 1390, 00: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, 08:32 صبح
سلام.
از کمکت خیلی ممنونم دوست عزیز.
ولی این به من کمکی نمیکنه. من باید با استفاده از mainsection و section به یه قسمت از xml دسترسی پیدا کنم بعدش اونو بخونم.
در ضمن فایلهای xml من زیاد هستن و با هم تفاوت دارن(از لحاظ اندازه و محل قرار گیری عناصر) به همین خاطر من باید از کلاس xmlreader استفاده کنم.
برای مثال تو فایل حرکت کنم و هر جا به mainsection با title = cpu رسیدم section مربوط به اونو بخونم و اطلاعات و تو یه پایگاه داده نمایش بدم

mehdi.mousavi
دوشنبه 17 مرداد 1390, 11: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, 12:13 عصر
از کمکت خیلی ممنونم.
فقط میشه این قسمت و یکم بیشتر توضیح بدین:
string xpath = string.Format("//mainsection[@id={0}]/section[@id={1}]/data", mainSectionId, sectionId);

تو این قسمت هست که نوع جستجو مشخص می کنین؟
و یه سوال دیگه میشه بگین برای Xdocument به کدوم کتابخانه نیاز داریم؟

mehdi.mousavi
دوشنبه 17 مرداد 1390, 12: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, 17: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, 17:58 عصر
میشه یه منبع برای مطالعه ی LINQ معرفی کنید ؟