DataSet用法(四) 读写XML
ReadXml 提供了只将数据或同时将数据和架构从 XML 文档读入 DataSet 的方式(若要同时读数据和架构,请使用包括 mode 参数的 ReadXML 重载之一,并将其值设置为 ReadSchema)。ReadXmlSchema 方法仅读架构。
对于 WriteXml 和 WriteXmlSchema 方法也是如此。若要写入来自 DataSet 的 XML 数据或架构和数据两者,使用 WriteXml 方法。若要只写入架构,请使用 WriteXmlSchema 方法。
XML 数据可直接从文件、Stream 对象、XmlWriter 对象或 TextWriter 对象中读取。可以根据需要使用 ReadXml 的两组重载方法中的一组。第一组中的四个重载方法只取一个参数。第二组中的四个重载方法除了取第一组中的一个参数外另外多取了一个参数 (XmlReadMode)。
1、ReadXml 方法的重载形式
DataSet.ReadXml (Stream) 使用指定的 System.IO.Stream 将 XML 架构和数据读入 DataSet。
DataSet.ReadXml (String) 使用指定的文件将 XML 架构和数据读入 DataSet。
DataSet.ReadXml (TextReader) 使用指定的 System.IO.TextReader 将 XML 架构和数据读入 DataSet。
DataSet.ReadXml (XmlReader) 使用指定的 System.Xml.XmlReader 将 XML 架构和数据读入 DataSet。
DataSet.ReadXml (Stream, XmlReadMode) 使用指定的 System.IO.Stream 和 XmlReadMode 将 XML 架构和数据读入DataSet。
DataSet.ReadXml (String, XmlReadMode) 使用指定的文件和 XmlReadMode 将 XML 架构和数据读入 DataSet。
DataSet.ReadXml (TextReader, XmlReadMode) 使用指定的 System.IO.TextReader 和 XmlReadMode 将 XML 架构和数据读入DataSet。
DataSet.ReadXml (XmlReader, XmlReadMode) 使用指定的 System.Xml.XmlReader 和 XmlReadMode 将 XML 架构和数据读入DataSet。
2、ReadXml 方法的重载形式
WriteXml(Stream) 使用指定的 System.IO.Stream 为 DataSet 写当前数据。
WriteXml(TextWriter) 使用指定的 TextWriter 为 DataSet 写当前数据。
WriteXml(String) 将 DataSet 的当前数据写入指定的文件。
WriteXml(XmlWriter) 将 DataSet 的当前数据写入指定的 XmlWriter。
WriteXml(Stream, XmlWriteMode) 使用指定的 System.IO.Stream 和 XmlWriteMode 为 DataSet 写当前数据,还可以选择写架构。若要写架构,请将 mode 参数的值设置为 WriteSchema。
WriteXml(TextWriter, XmlWriteMode) 使用指定的 TextWriter 和 XmlWriteMode 为 DataSet 写当前数据,还可以选择写架构。若要写架构,请将 mode 参数的值设置为 WriteSchema。
WriteXml(String, XmlWriteMode) 使用指定的 XmlWriteMode 将 DataSet 的当前数据写入指定的文件,还可以选择将架构写入指定的文件。若要写架构,请将 mode 参数的值设置为 WriteSchema。
WriteXml(XmlWriter, XmlWriteMode) 使用指定的 XmlWriter 和 XmlWriteMode 为 DataSet 写当前数据,还可以选择写架构。若要写架构,请将 mode 参数的值设置为 WriteSchema。
3、注意点
(1)如果指定内联架构,则该内联架构用于在加载数据之前扩展现有的关系结构。如果存在任何冲突(例如,用不同的数据类型定义了同一个表中的同一列),将引发异常。
(2)如果未指定内联架构,则在必要时按照 XML 文档的结构通过推理扩展关系结构。如果不能通过推理扩展架构以公开所有数据,则将引发异常。
(3)如果 DataSet 的 XML 架构包含 targetNamespace,则可能无法读取数据,并且在调用 ReadXml 以加载 XML 中包含具有无限定命名空间的元素的DataSet 时,可能会发生异常。若要读取非限定元素,请按下例的演示,在 XML 架构中将 elementFormDefault 设置为“qualified”。
<xsd:schema id="MyDataSet"
elementFormDefault="qualified"
targetNamespace="http://www.tempuri.org/MyDataSet.xsd"
xmlns="http://www.tempuri.org/MyDataSet.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
</xsd:schema>
(4)如果 DataSet 的架构包含同一命名空间中同名但类型不同的元素,则当您尝试通过指定 XmlReadMode.ReadSchema 将该架构读入具有ReadXml 的 DataSet 时,将发生异常
4、实例:
(1)WriteXml()
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace sqlconnection1
{
class Program
{
private void SQLConnectionF(string source, string select)
{
//创建连接
SqlConnection con = new SqlConnection(source);
SqlDataAdapter adapt = new SqlDataAdapter(select, con);
try
{
con.Open();
Console.WriteLine("connection is successful!");
}
catch (Exception e)
{
Console.WriteLine("connection error is :{0}", e.ToString());
}
//创建DataSet
DataSet ds = new DataSet();
//将数据添加到DataSet中
adapt.Fill(ds, "mytest");
ds.WriteXml(@"e:\mytest.xml");
Console.ReadLine();
con.Close();
}
static void Main(string[] args)
{
string sou = "server=duanyf\\SQLEXPRESS;" + "Initial Catalog=master;" + "UID = sa;" + "Password = dyf123";
string sel = "SELECT name,number,low,high From dbo.spt_values";
Program sqlcon = new Program();
sqlcon.SQLConnectionF(sou, sel);
}
}
}
(2)ReadXml()
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace sqlconnection1
{
class Program
{
static void Main(string[] args)
{
DataSet dsxml = new DataSet();
dsxml.ReadXml(@"e:\mytest.xml");
Console.WriteLine("{0,-20} {1,-15}{2,-10}{3,-10}",dsxml.Tables[0].Columns[0],dsxml.Tables[0].Columns[1],
dsxml.Tables [0].Columns [2],dsxml .Tables[0].Columns[3]);
foreach (DataRow row in dsxml.Tables[0].Rows)
{
Console.WriteLine("{0,-20} {1,-15}{2,-10}{3,-10}",row[0],row[1],row[2],row[3]);
}
Console.ReadLine();
}
}
}