HOW TO:在 Visual C# .NET 中使用 System.Xml 合并两个 XML 文档中的数据
概要
本分步指导文章说明了如何使用
DataSet 对象合并两个 XML 文档。在使用 ADO.NET 支持断开连接的、分布式的数据方案时,
DataSet(数据集)对象是关键所在。
数据集是数据在内存中的表示形式,它提供了一致的关系编程模型,而不用关心数据源的位置。
数据集表示完整的一组数据,包括相关的表、约束以及各表之间的关系。
要求
下面的列表列出了推荐使用的硬件、软件、网络结构以及所需的 Service Pack:
- Microsoft Windows XP、Windows 2000 或 Windows NT 4.0 Service Pack 6a (SP6a)
- Microsoft Visual Studio .NET
本文假定您熟悉下列主题:
- Visual C# .NET 语法
- 可扩展标记语言 (XML)
创建 Books1.xml 文件
- 从 Windows 开始菜单,单击运行,键入 Notepad.exe,然后单击确定。
- 突出显示以下代码,右键单击突出显示的内容,然后单击复制。在"记事本"中,在编辑菜单上,单击粘贴。
<?xml version='1.0' encoding='utf-16'?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
</book>
<book id="bk102">
<author>Jeanette, Dasha</author>
<title>Quack the Duck</title>
<genre>Fantasy</genre>
<price>5.95</price>
</book>
</catalog>
- 在文件菜单上,单击保存。
- 在另存为对话框中,在保存类型下拉列表框中,单击所有文件。在文件名文本框中,键入 Books1.xml,然后单击保存。
创建 Books2.xml 文件
- 在"记事本"中,新建一个名为 Books2.xml 的文本文件。
- 复制以下 XML 并将其粘贴到 Books2.xml 中:
<?xml version='1.0' encoding='utf-16'?>
<catalog>
<book id="bk106">
<author>Randall, Cynthia</author>
<title>Lover Birds</title>
<genre>Romance</genre>
<price>4.95</price>
</book>
<book id="bk107">
<author>Vinzovskaia, Irina</author>
<title>Piano Fort A</title>
<genre>Romance</genre>
<price>4.95</price>
</book>
</catalog>
- 在文件菜单上,单击保存。
- 在另存为对话框中,在保存类型下拉列表框中,单击所有文件。在文件名文本框中,键入 Books2.xml,然后单击保存。
创建 Visual C# .NET 应用程序的步骤
- 启动 Visual Studio .NET,然后新建一个 Visual C# 控制台应用程序项目。
- 将下面的代码添加到"代码"窗口顶部:
using System;
using System.Xml;
using System.IO;
using System.Data ;
- 复制以下代码并将其粘贴到 static void Main(string[] args) 中:
try
{
XmlTextReader xmlreader1 = new XmlTextReader("C://Books1.xml");
XmlTextReader xmlreader2 = new XmlTextReader("C://Books2.xml");
DataSet ds = new DataSet();
s.ReadXml(xmlreader1);
DataSet ds2 = new DataSet();
ds2.ReadXml(xmlreader2);
ds.Merge(ds2);
ds.WriteXml("C://Books.xml");
Console.WriteLine("Completed merging XML documents");
}
catch (System.Exception ex)
{
Console.Write(ex.Message);
}
Console.Read();
- 生成并运行该应用程序。请注意,"控制台"窗口中会显示消息:Completed merging XML documents(XML 文档合并完成)。
- 关闭"控制台"窗口。请注意,Books.xml 文件已在您指定的路径中创建出来。
- 打开 Books.xml。请注意,Books2.xml 中的数据已附加到 Books1.xml 的末尾。
不同的 XML 文档方案
合并具有相同结构的 XML 文档
前面的 Visual C# .NET 示例演示了具有相同结构的 XML 文档的输出。
合并具有不同结构的 XML 文档
- 打开 Books2.xml,然后将 XML 替换为以下 XML:
<?xml version="1.0" ?>
<SampleData>
<Customer>
<CustomerName>Bob Frapples</CustomerName>
<PricePerUnit>5.95</PricePerUnit>
<ClosingDate>2001-12-16</ClosingDate>
</Customer>
<Customer>
<CustomerName>Bob Frapples</CustomerName>
<PricePerUnit>5.95</PricePerUnit>
<ClosingDate>2001-12-16</ClosingDate>
</Customer>
</SampleData>
- 保存 Books2.xml。
- 再次运行 Visual C# .NET 项目。请注意,第二个文档 (Books2.xml) 的节点已附加到第一个 XML 文档 (Books1.xml) 中。
合并具有相似结构的 XML 文档(第二个文档包含其他元素)
- 打开 Books2.xml,将其中的 XML 替换为以下 XML:
<?xml version='1.0' encoding='utf-16'?>
<catalog>
<book id="bk106">
<author>Randall, Cynthia</author>
<title>Lover Birds</title>
<genre>Romance</genre>
<price>4.95</price>
<publish_date>2000-09-02</publish_date>
<description>When Carla meets Paul at an ornithology
conference, tempers fly as feathers get ruffled.</description>
</book>
<book id="bk107">
<author>Vinzovskaia, Irina</author>
<title>Piano Fort A</title>
<genre>Romance</genre>
<price>4.95</price>
<publish_date>2000-11-02</publish_date>
<description>Two young pianists strike a chord when they fight a
pitched battle to stop the metro gnomes at a key base.</description>
</book>
</catalog>
- 保存 Books2.xml。
- 再次运行 Visual C# .NET 项目。请注意,第二个文档的节点已附加到第一个 XML 文档中。
合并具有相似结构的 XML 文档(第二个文档包含属性)
- 打开 Books2.xml,将其中的 XML 替换为以下 XML:
<?xml version='1.0' encoding='utf-16'?>
<catalog>
<book id="bk106" genre="Romance">
<author>Randall, Cynthia</author>
<title>Lover Birds</title>
<price>4.95</price>
</book>
<book id="bk107" genre="Romance">
<author>Vinzovskaia, Irina</author>
<title>Piano Fort A</title>
<price>4.95</price>
</book>
<book id="bk108" genre="Horror">
<author>de Dogg, Jazz</author>
<title>Night of the Flea</title>
<price>4.95</price>
</book>
</catalog>
- 保存 Books2.xml。
- 再次运行 Visual C# .NET 项目。请注意,第二个文档中的节点已附加到第一个 XML 文档中,结构与第一个 XML 文档相同。
合并具有相似结构的 XML 文档(第一个文档包含属性)
- 按照以下方式修改 Visual C# 代码,以便将 Books1.xml 附加到 Books2.xml 中:
try
{
XmlTextReader xmlreader1 = new XmlTextReader("C://Books2.xml");
XmlTextReader xmlreader2 = new XmlTextReader("C://Books1.xml");
DataSet ds = new DataSet();
s.ReadXml(xmlreader1);
DataSet ds2 = new DataSet();
ds2.ReadXml(xmlreader2);
ds.Merge(ds2);
ds.WriteXml("C://Books.xml");
Console.WriteLine("Completed merging XML documents");
}
catch (System.Exception ex)
{
Console.Write(ex.Message);
}
Console.Read();
- 再次运行 Visual C# .NET 项目。请注意,生成的 XML 文档将 Books1.xml 中的节点附加到了 Books2.xml 中。另外您会注意到,所有的 Book 节点都包含"genre"属性。
因此,根据第一个 XML 文档的结构,需要对第二个 XML 文档加以修改以便使生成的 XML 更有意义