Create XML from XSD by Using Dataset
前几天实习单位的一个同事问我关于XSD和XML的关系和互转实现。帮他做了个Demo,也觉得这个话题值得一聊,因此整理此文和大家分享。
首先先说一下XML和XSD。
根据w3schools提到的对XML的定义:
XML stands for eXtensible Markup Language.
XML is designed to transport and store data.
根据w3schools提到的对XSD的定义:
An XML Schema describes the structure of an XML document.
通俗地说:XSD是定义结构的,XML是用来存储针对该XSD结构的数据。
举例说一下:
如果有个文件叫XMLSchema1.xsd,内容如下:
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="XMLSchema1" targetNamespace="http://tempuri.org/XMLSchema1.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema1.xsd" xmlns:mstns="http://tempuri.org/XMLSchema1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:int" /> <xs:element name="name" type="xs:string" /> <xs:element name="address" type="xs:string" /> <xs:element name="city" type="xs:string" /> <xs:element name="country" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
对应生成的一个XML文件叫XMLFile1.xml,内容如下:
<?xml version="1.0" standalone="yes"?> <XMLSchema1 xmlns="http://tempuri.org/XMLSchema1.xsd"> <person> <id>1</id> <name>Bill</name> <address>GUCAS</address> <city>Beijing</city> <country>China</country> </person> </XMLSchema1>
到此各位可能会发现,其实XSD文件本身也是个XML文件,他就是一个存储另外一个XML文件结构的XML文件。(嚯嚯,有点拗口!)
通常情况下,自从.Net有了Linq之后,我无论处理XML、XSD或者是数据库关系等等,我都喜欢用Linq,因为用它来操作很直接很方便很高效。
但是由于Linq需要较高版本的.Net Framework支持,高版本VS限制以及用Linq操作需要有比较好的结构思维,很多人更喜欢用比较直观的Dataset来处理。
注:本文针对于.Net Framework,以C#代码为例
将通过上述XSD文件来生成XML的代码如下:
DataSet ds = new DataSet(); ds.ReadXmlSchema(@"XMLSchema1.xsd"); DataRow dr = ds.Tables[0].NewRow(); dr[0] = "1"; dr[1] = "Bill"; dr[2] = "GUCAS"; dr[3] = "Beijing"; dr[4] = "China"; ds.Tables[0].Rows.Add(dr); ds.WriteXml(@"XMLFile1.xml");
从上述代码显而易见,Dataset可以让用户直观的将一个XSD当作一个二维数据表来进行处理。
person表
| id | name | address | city | country |
接下来我想各位可能会有疑问,如果这个XSD所包含的结构不是简单的二维关系,那怎么通过Dataset处理呢?
这就是我想写本文的关键。那天我同事也是因为卡在这个问题上才来问我的。
我们可以在刚刚那个XSD的基础上稍微修改一下,得到这个新的XMLSchema1.xsd,内容如下:
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="XMLSchema1" targetNamespace="http://tempuri.org/XMLSchema1.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema1.xsd" xmlns:mstns="http://tempuri.org/XMLSchema1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:int" /> <xs:element name="name" type="xs:string" /> <xs:element name="address" type="xs:string" /> <xs:element name="city" type="xs:string" /> <xs:element name="country" type="xs:string" /> <xs:element name="pet"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:int" /> <xs:element name="name" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
生成的一个叫XMLFile1.xml的XML文件,内容如下:
<?xml version="1.0" standalone="yes"?> <XMLSchema1 xmlns="http://tempuri.org/XMLSchema1.xsd"> <person> <id>1</id> <name>Bill</name> <address>GUCAS</address> <city>Beijing</city> <country>China</country> <pet> <id>1</id> <name>Cat</name> </pet> <pet> <id>2</id> <name>Mouse</name> </pet> </person> </XMLSchema1>
.Net还是相当的智能,其实当用Dataset读取了XSD的结构时,Dataset会自动将非二维的结构转换成为等价的几个二维结构的表格来方便用户处理。
上面提到这个结构会被其分割为两个二维表:
person表
| id | name | address | city | country | person_id |
和pet表
| id | name | person_id |
我想应该不难看出person_id是将这两个表连接的关键。
有了对上面Dataset分析XSD工作原理的介绍,我想接下来的代码就不难明白了。嚯嚯![]()
DataSet ds = new DataSet(); ds.ReadXmlSchema(@"XMLSchema1.xsd"); DataRow dr = ds.Tables[0].NewRow(); dr[0] = "1"; dr[1] = "Bill"; dr[2] = "GUCAS"; dr[3] = "Beijing"; dr[4] = "China"; dr[5] = "1"; DataRow subdr1 = ds.Tables[1].NewRow(); subdr1[0] = "1"; subdr1[1] = "Cat"; subdr1[2] = "1"; DataRow subdr2 = ds.Tables[1].NewRow(); subdr2[0] = "2"; subdr2[1] = "Mouse"; subdr2[2] = "1"; ds.Tables[0].Rows.Add(dr); ds.Tables[1].Rows.Add(subdr1); ds.Tables[1].Rows.Add(subdr2); ds.WriteXml(@"XMLFile1.xml");
本文简单的介绍.Net中利用Dataset处理XSD的方法,并不是非常详细,旨在抛砖引玉和帮助.Net新人的学习。
如有什么鄙陋之处,不吝赐教!
Push








[New Blog Post] Create XML from XSD by Using Dataset http://bit.ly/7rQPpr
This comment was originally posted on Twitter
那个using可以去掉
@Solrex
主要是By using这个句式用习惯了
嚯嚯
受教了,正烦恼这东西,谢谢
受教了,正好需要用.NET读取一些标准格式的xml~~,非常感谢
@suzker
@Suzker
客气了!能给各位帮助,我的这篇文章就起到作用了
很深奥哦~