Данни в XML документ

C# за професионалисти

За кого е тази книга?

Основни теми на книгата

Платформата .NET предлага нова среда, в която можете да разработите практически всяко приложение, което работи под Windows, а C# е нов език за програмиране, създаден специално за работа с .NET.

Тази книга представя всички основни концепции на езика C# и платформата .NET. Напълно описва синтаксиса на C#, предоставя примери за изграждане на различни типове приложения с помощта на C# - изграждане на Windows приложения и услуги, WWW приложения и услуги с ASP.NET и Windows и WWW контроли Обхваща общи библиотеки с .NET класове, по-специално достъп до данни с ADO.NET и достъп до Active Directory с помощта на класовете DirectoryServices.

Тази книга е предназначена за опитни разработчици, които може да имат опит в програмирането на VB, C++ или Java, но които преди това не са използвали езика C# и платформата .NET в работата си. За програмистите, използващи съвременни технологии, книгата ще даде пълно разбиране как да пишат програми на C # за платформата .NET.

• Всички функции на езика C#

• C# и обектно-ориентирано програмиране

• Windows приложения и услуги

• Създаване на уеб страници и уеб услуги чрез ASP NET

• Достъп до данни чрез ADO NET

• Изграждане на разпределени приложения с NET Remoting

• Интеграция с COM, COM+ и Active Directory

Книга: C# за професионалисти. Том II

ADO.NET данни в XML документ

ADO.NET данни в XML документ

Първият пример, който ще бъде разгледан, използва ADO.NET и XML потоци за извличане на данни от базата данни на Northwind в DataSet, зареждане на XmlDocument обект,съдържащи XML от DataSet и зареждайки XML в списъчната кутия по същия начин, както преди. За да изпълните няколко от следните примери, трябва да добавите изрази using:

използване на System.Data; използване на System.Xml; използване на System.Data.SqlClient; използване на System.IO;

Също така, за ADO примерите, DataGrid е добавен към формулярите, което ще ни позволи да видим данните в DataSet от ADO.NET, тъй като е ограничен от мрежата, както и данните от генерираните XML документи, които се зареждат в списъка. Ето кода за първия пример, който може да се намери в папката ADOSample1:

private void button1_Click(object sender, System.EventArgs e) // създаване на DataSet DataSet DataSet ds=new DataSet("XMLProducts"); //свържете се с база данни Northwind и //изберете всички редове от таблицата с продукти //уверете се, че потребителското име съвпада с версията на SqlServer SqlConnection conn= new SqlConnection(@"server=GLYNNJ_CSNetSDK;u > SqlDataAdapter da=new SqDataAdapter("select * from products", conn);

След SqlDataAdapter, da и DataSet, ds са инстанцирани, обектът MemoryStream, обектът StreamReader и обектът StreamWriter са инстанцирани. Обектите StreamReader и StreamWriter ще използват MemoryStream за навигация в XML:

MemoryStream memStrm=нов MemoryStream(); StreamReader strmRead=нов StreamReader(memStrm); StreamWriter strmWrite=нов StreamWriter(memStrm);

Ще използваме MemoryStream, така че нищо няма да бъде записано на диска, но можем да използваме всеки базиран на поток обект, като например FileStream. След това ще попълним DataSet и ще го свържем с DataGrid. Данните от DataSet сега ще бъдат показани в DataGrid:

da.Fill(ds, "продукти"); // зареждане на данни в DataGrid dataGr > данни Gr;

Наследващата стъпка генерира XML. Извиква се методът WriteXml от класа DataSet. WriteXml генерира XML документ. Има две претоварени версии на WriteXml, едната приема низ с пътя и името на файла, а другият метод има добавен параметър за режим. Този режим е XmlWriteMode enum. Възможните стойности са DiffGram, IgnoreSchema и WriteSchema. Ще обсъдим DiffGram по-късно в този раздел. IgnoreSchema се използва, когато не искате WriteXml да записва вградена ( inline ) схема в XML файла; използвайте опцията WriteSchema, ако желаете. За да получите точно схемата, се извиква WriteXmlSchema. Този метод има четири претоварени версии. Получава се низ, съдържащ пътя и името на файла, където е написан XML документът. Втората версия използва обект, който е базиран на класа XmlWriter. Третата версия използва обект, който е базиран на класа TextWriter. В примера се използва четвъртата версия, параметърът в този случай е извлечен от класа Stream:

ds.WriteXml(strmWrite, XmlWriteMode.IgnoreSchema); memStrm.Seek(0, SeekOrigin, Begin); // четене от поток от памет в обект XmlDocument doc.load(strmRead); // вземете всички продуктови елементи XmlNodeList nodeLst=doc.GetElementsByTagName("ProductName"); //заредете ги в списъчното поле foreach(XmlNode nd in nodeLst) listBox1.Items.Add(nd.InnerText); > private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) // при щракване в списъчното поле // се появява поле за съобщение с цената на артикула string srch= "XmlProducts/products[ProductName= " + '"' + listBox1.SelectedItem.ToString() + "]"; Xml Node foundNode=doc.SelectSingleNo de(srch); if (foundNode!=null) MessageBox.Show(foundNode.SelectSingleNode("UnitPrice").InnerText); else MessageBox.Show("Не е намерено"); >

На следващия екран можете да видите данните в списъка, както и в таблицата с данни:

данни

Ако искате да запишете XML документа на диск, бихте направили нещо подобно:

файл с низ = "c:testproduct.xml"; ds.WriteXml(файл);

Това ще ни даде добре оформен XML документ на диск, който може да бъде прочетен от друга нишка, използвайки DataSet, или може да бъде използван от друго приложение или уебсайт. Тъй като не е дефиниран параметър XmlMode, този XmlDocument ще съдържа схемата. В нашия пример поток се използва като параметър за метода XmlDocument.Load.

С готовия XmlDocument зареждаме списъчната кутия, използвайки същия XPath обект, който използвахме преди. Ако се вгледате внимателно, ще забележите, че събитието listBox1_SelectedIndexChanged се е променило леко. Вместо извеждане на InnerText на елемента, друго търсене в XPath се извършва с помощта на SelectSingleNode, за да се получи UnitPrice на елемента. Всеки път, когато се щракне върху продукт в списъка, ще се появи MessageBox за UnitPrise. Сега имаме два изгледа на данните, но по-важното е, че имаме способността да манипулираме данните, използвайки два различни модела. Можете да използвате пространството от имена на данни за данни или пространството от имена на XML за данни. Този подход води до много гъвкав дизайн в приложенията, тъй като сега при програмиране няма твърда връзка само с един обектен модел. По този начин имаме множество изгледи на едни и същи данни и множество начини за достъп до данните.

Следващият пример ще опрости процеса, като премахне три нишки и използва някоиФункции на ADO, вградени в пространството на имена на XML. Ще трябва да променим кодовия ред на ниво модул:

private XmlDocument doc=нов XmlDocument();

частен XmlDataDocument документ;

Това трябва да се направи, тъй като няма да използваме XmlDataDocument. Ето кода, който може да бъде намерен в папката ADOSample2:

private void button1_Click(object sender, System.EventArgs e) // създаване на набор от данни (DataSet) DataSet ds=new DataSet("XMLProducts"); //свържете се с база данни Northwind и //изберете всички редове от таблицата с продукти //извършете промени в низа за свързване въз основа на потребителско име и име на сървър SqlConnection conn= new SqlConnection(@"server=GLYNNJ_CSNetSDK;u > SqlDataAdapter da=new SqlDataAdapter("select * from products", conn); // попълване на набор da.Fill(ds, "продукти"); // зареждане на данни в мрежа dataGr > dataGr ; doc=new XmlDataDocument(ds); // извличане на всички елементи от продукти XmlNodeList nodeLst=doc.GetElementsByTagName("ProductName"); // зареждане в списък кутия // използвайте for цикъл тук for( intctr=0;ctr

Както можете да видите, кодът за зареждане на DataSet в XML документ е опростен. Вместо да се използва класът XmlDocument, се използва класът XmlDataDocument. Този клас е създаден специално за използване на данни с обект DataSet.

XmlDataDocument е базиран на класа XmlDocument, така че има цялата функционалност на класа XmlDocument. Една от основните разлики е претовареният конструктор за XmlDataDocument. Обърнете внимание на реда с код, където е създаден екземплярът XmlDataDocument:

XmlDataDocument doc=нов XmlDataDocument(ds);