介绍: 在这篇文章中你将看到怎样通过微软的.NET平台中C#语言处理XML文档。第一步我将简要讨论.NET Framework Library 中有关XML的命名空间和类。然后我们将读取和写入XML文档,在这篇文章的末尾,我会告诉您如何利用ADO.NET和XML.NET模型从关系数据库中读取和写入XML文件,反之亦然。 介绍微软的.NeT的XML命名空间和类: 在我们让XML文档和.NET Framework一起工作之前,我们有必要了解一下.NET 类库提供的(有关XML的)命名空间。 .NET提供五个支持XML类的命名空间,它们是:
System.Xml System.Xml.Schema System.Xml.Serialization System.Xml.XPath System.Xml.Xsl
System.Xml 命名空间包含了主要的XML类,这个命名空间包含很多读写XML文档的类,它们是以下这些类:
XmlReader XmlTextReader XmlValidatingReader XmlNodeReader XmlWriter XmlTextWriter
(以上)你可以看到有4个读取的2个写入的类。在这篇文章中,我们将集中在读取和写入的类上,这些类常常被用在读取和写入XML文档中。
XmlReader 类是个抽象的基类,包含了很多读取文档的方法和属性。Read方法在流中读取一个节点,除读取功能以外,这个类也包含了浏览文档节点的方法。其中一些方法如下:
MoveToAttribute MoveToFirstAttribute MoveToContent MoveToFirstContent MoveToElement MoveToNextAttribute
还有其他更多有关读取的方法如:ReadString、 ReadInnerXml、 ReadOuterXml,和 ReadStartElement 。这些类中也有方法可以一步一步从当前节点移动到下一个节点。我们将在后面的例子中看到这些方法。
XmlTextReader、 XmlNodeReader 和XmlValidatingReader 类都是从 XmlReader 中派生出来的。从他们的名字上就可以看出,它们是用来读取文本、节点和架构的。
XmlWrite类包含的功能是将数据写入文档,这个类提供了很多写入方法用来写入XML文档项目。这个类是XmlTextWriter类的基类,我们将在实例中使用它。
读取XML文档
在我们的示例程序中,我们将通过 XmlTextReader类读取和显示books.xml 中的数据。这个文件在VS.NET 示例中附带了(安装好VS.NET 就有了,微软提供的示例)。你可以在你的电脑上搜索它并像下面一样改变文件路径:
XmlTextReader textReader = new XmlTextReader("C:\\books.xml");
或者你使用其他任何的XML文档。 XmlTextReader, XmlNodeReader 和 XmlValidatingReader 类是从XmlReader类中派生的,除了XmlReader的属性和方法之外,这些类还分别包含了读取文本、节点和框架的成员。我使用XmlTextReader类读取XML文件。通过文件名作为参数的构造你可以读取文件。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace XMLSerialzation
{
class Program
{
static void Main(string[] args)
{
ShoppingList myList = new ShoppingList();
myList.AddItem(new Item("eggs",1.49));
myList.AddItem(new Item("ground beef", 3.69));
myList.AddItem(new Item("bread",0.89));
Console.WriteLine("in main after adding ");
// Serialization
XmlSerializer s = new XmlSerializer(typeof(ShoppingList));
Console.WriteLine("xml serializer object created ");
TextWriter w = new StreamWriter(@"c:\list.xml");
Console.WriteLine("text writer serializer object created ");
s.Serialize(w, myList);
Console.WriteLine("serialize called ");
w.Close();
// Deserialization
ShoppingList newList;
TextReader r = new StreamReader(@"c:\list.xml");
newList = (ShoppingList)s.Deserialize(r);
r.Close();
Console.ReadLine();
}
}
[XmlRoot("shoppingList")]
public class ShoppingList
{
private ArrayList listShopping;
public ShoppingList()
{
listShopping = new ArrayList();
}
[XmlElement("itemone")]
public Item[] Items
{
get
{
Item[] items = new Item[listShopping.Count];
listShopping.CopyTo(items);
Console.WriteLine("called get of item []");
return items;
}
set
{
if (value == null) return;
Item[] items = (Item[])value;
listShopping.Clear();
foreach (Item item in items)
listShopping.Add(item);
}
}
public int AddItem(Item item)
{
Console.WriteLine("in AddItem with item object ");
Console.WriteLine("return "+listShopping.Add(item));
return listShopping.Add(item);
}
}
// Items in the shopping list
public class Item
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("price")]
public double price;
public Item()
{
}
public Item(string Name, double Price)
{
Console.WriteLine("in item constructor with two argument");
name = Name;
price = Price;
}
}
}
本文同步发布在译者的Blog:Open ABC












C#中的XML
翻译:

Bill 状元 | Blog
恩恩,发给一个学编程的哥们儿……
05/25/2008