//导出dataset数据到XML文件
//Author:Quietwalk
//2010-09-09
publicboolExportToXMl(DataSetds,stringstrXMLPath)
{
//DirectoryInfo mobileDir = new DirectoryInfo(strXMLPath);
FileInfoXMLfile =newFileInfo(strXMLPath);
boolbReturnValue =false;
try
{
if(ds !=null&& ds.Tables.Count > 0 && XMLfile.Exists)
ds.WriteXml(strXMLPath,XmlWriteMode.WriteSchema);
bReturnValue =true;
}
catch(sqlCeExceptionex)
throw(ex);
returnbReturnValue;
}
//XML数据导入到 DataSet中
publicDataSetImportFromXml(stringfromPath)
FileInfoxmlFile =newFileInfo(fromPath);
DataSetdsXML =null;
if(xmlFile.Exists)
FileStreamfsReadXml =newFileStream(fromPath,175);">FileMode.Open);
XmlTextReadermyXmlReader =newXmlTextReader(fsReadXml);
dsXML=newDataSet();
dsXML.ReadXml(myXmlReader);
myXmlReader.Close();
returndsXML;
说明:
DateSet.ReadXML()
ReadXML缺省使用XmlReadMode.Auto方式读取,这就给大数据量留下了低效率的伏笔。因为如果XML没有Scheme,DataSet就会自己推算的结构,然后再加载,这就是低效的主要原因。让推算不让我们帮他算,因为已经提供了一个ReadXmlSchema方法。
dataset是这样存储的:table(0)中存放feature层的信息,包括fno等属性,只有一行;
table(1)中包括attribute的信息包括ano等属性,有两行。如果下还有其他子层,就依次放在table(2)..中。读取数据之后,可以与datagrid绑定进行显示,绑定时可以针对中的单个表,也可以一次绑定所有表。
1.载入xml文件的格式要求
a.不可以读取空的文件.
如果使用DataSet.ReadXml载入一个空的文件,将出现异常因为没有根元素.
b.可以读取没有<?xml?>头的xml文件你的文件可以不包含<?xml version="1.0" encoding="utf-8" ?>这样的代码.
2.xml文件的编码格式
a.<?xml?>头中标记的编码最好和文件自身的编码一致在测试文件中我使用utf-32存储标记为utf-8的或者反过来都导致了读取文件异常.虽然我并没有对所有的编码进行测试而且用ASCII时读取不会出现异常只不过中文可能会出现乱码最好还是保持编码一致吧采用存储文件可能出现中文乱码.
xml自身是不支持虽然读取没有异常但你读取的信息可能是一堆"?".
3. XmlReadMode参数对DataSet读取xml文件的影响
非典型如果包含架构并使用默认的或者忽略此选项将只载入文件中符合架构的数据如果你的数据集中包含了架构信息例如定义了S1,T1(Name string,Age int),Student(Name string,Teacher 4个表数据集名称为TestDS,51);">命名空间为http://tempuri.org/TestDS.xsd,如果一个的xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<TestDS xmlns="http://tempuri.org/TestDS.xsd">
<Student>
<Name>小明</Name>
<Age>12</Age>
</Student>
<Teacher>
<Name>王老师</Name>
<Age>32</Age>
</Teacher>
<Room>
<ID>123</ID>
</Room>
</TestDS>
使用读取此文件时第一个Student被读取到表中因为中对应的列名数据类型和架构一致第二个Teacher不会被读取架构中虽然包含了表Teacher,51);">但并没有定义任何的列而中的包含了Name,Age两个列第三个Room因为架构中不包含表Room.以上是针对非典型测试的结果典型应该也是如此有兴趣的朋友可以自己测试一下如果不包含架构将分析并采用文件的架构如果仅仅使用new创建了一个非典型DataSet,51);">那么中尚未包含架构:
<?xml version="1.0" encoding="utf-8" ?>
<TestDS xmlns="http://tempuri.org/TestDS.xsd">
<Room>
<ID>123</ID>
</Room>
<Room>
<ID>123</ID>
<Name>储藏室</Name>
</Room>
</TestDS>
当读取将分析数据集名称命名空间并针对每一条数据进行架构分析我想这一点很重要正如上面的文件中当读取到第一个分析得到需要Room(ID)这样的表读取第二个会发现表的架构信息已经存在经过对比发现需要变更架构为Room(ID,Name).每一条数据除了架构分析以外还要进行可能的架构更改工作因此在效率上可能不及a中说到的情况c.对于XmlReadMode的其余选项似乎并不用于ReadXml方法或者没有实际效果4.载入xml字符串,byte[]数组到DataSet
DataSet.ReadXml(new StringReader(string))
xml字符串应该是合法的如果在字符串的头中指定encoding,51);">那么指定任何编码都可以读取中文字符也就是说指定对于载入是没有作用的DataSet.ReadXml(new MemoryStream(byte[]))byte[]数组表示的载入到DataSet.
对于编码载入数组和载入文件的要求是类似的<?xml?>头中标记的编码应该和数组的编码一致最好不要采用ASCII,51);">原因在上文中已经提到Encoding.GetBytes方法将字符串转化为数组时编码应该对照如果Encoding.UTF8.GetBytes,51);">那么字符串中头应该标记uft-8,51);">另外也可以不标记结果是相同的.
http://www.cnblogs.com/quietwalk/archive/2010/09/09/1822192.html