快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

应用XML架构文件

  工作上,有时会碰到系统间数据交互的问题。之前我做过的方式是,源系统将数据导出为文本文件(TXT后缀),然后上传到目标系统,分析、读取。现在好一点,应用web service,编写一个数据接口,在程序里直接调用,而无须再经过人工上传一道工序。并且web service传送的数据,全部是XML格式,可以很方便的读取,不必再自己写分析算法。当然,也因为是XML格式,每个字段值前后各一个标记,并且是明文,假如记录很多,可能需要传送的数据量就比较大了,这可能是不够好的地方。

  由于XML文件只存储数据,并无数据类型描述,因此从XML文件读入数据可能会出现数据类型与原先不符的情况。比如,有一表employee,结构如下:ID(INT),NAME(varchar(50)),在XML里表示为<EMPLOYEE><ID>1</ID><NAME>张三</NAME></EMPLOYEE>。这样,ID的类型原本为整型,而此时系统却以为是字符型!

  因为这个情况我们碰到了点问题。

  数据导入的时候,往往要加以分析,将导入的数据和现有数据比较,以确定是插入、更新还是删除。比较的算法,最简朴当然是将两个数据集(DataSet)来个嵌套循环,逐条记录比较。不过这种方式效率不高,可以改进一下,将两个数据集排好序,然后再来比较。

  怎样排序呢?从XML文件里读取数据,存放在数据集dsXml里,而现有数据,存放在数据集dsCur里,每个数据集里都只有一个DataTable。可以用DataTable的Select方式来实现排序,方式如下:

//从XML文件里读取数据

DataSet dsXml = new DataSet(“dsXml”);

DsXml.ReadXml(“employee.xml”);

//从现有数据库中读取数据。GetData是自定义的函数,从现有数据库中提取数据

DataSet dsCur = GetData();

//按照id的顺序排序。

//其中Select第一个参数是过滤条件,这里为空表示所有记录都适合;第二个参数表示排序字段

DataRow[] drsXml = dsXml.Tables[0].Select(“”,”id”);

DataRow[] drsCur = dsCur.Tables[0].Select(“”,”id”);

  然后比较这两个记录集:drsXml与drsCur。

  但是运行的结果却跟原先设想大相径庭。

  什么原因呢?

  原来就是因为在dsXml里,字段id是字符型。字符型排序不同于数值排序,假如让系统比较,”9”肯定大于”10”。因此,dsXml的排序没有得到我们预期的效果。

  看来要让系统知道id是整型。如何能做到?可以结合XML架构文件。

   dsXml.ReadXmlSchema("employee.xsd");

   dsXml.ReadXml(“employee.xml”,XmlReadMode.InferSchema);

  这样子读出来后,数据结构就跟架构文件employee.xsd里描述的一模相同了。

  补充一点,本人对架构文件语法不认识,是先用从数据库中拿到的数据集dsCur输出来,然后再稍作修改:

dsCur. WriteXmlSchema(“employee.xsd”); 


返回类别: 教程
上一教程: XML 编码
下一教程: 利用XMLHTTP无刷新自动实时更新数据

您可以阅读与"应用XML架构文件"相关的教程:
· 存储.NET应用程序到定制的XML .config文件中
· 广告控件中XML文件的写法
· 使用PHP DOM-XML创建和解析XML文件
· 使用.NET读取XML文件
· 将一个图片以二进制值的形式存入Xml文件中
    微笑服务 优质保证 索取样品