LINQ学习之旅——最后一站"LTX"之XML基本操作(上)
在上一节中,对LINQ TO XML编程接口中的所用到的类做了介绍,而其中有些类只是简单的描述了一下其概念,而并未说明它们具体是如何使用的。而从今天开始,接下来的几节将讲解LINQ TO XML的基本操作,在这些操作中就会涉及到这些编程接口类的使用。今天主要讲的LINQ TO XML基本操作中的创建部分。
我们在创建一个xml文档时,首先要有XML的声明,LINQ TO XML中是用XDeclaration类来创建XML声明。如下声明方式:
<?xml version="1.0" encoding="GB2312" standalone="no"?>
其中version指明xml的版本号,且它必须放在属性列表的第一位。因为当前xml最新版本是1.0,所以所有的xml声明都是version="1.0"。而encoding用于设定xml文档的编码格式。GB2312为汉字编码。最后的standalone是指是否和一个单独的DTD文件配套使用。(注:no表示需要单独的dtd文件配套使用);
当我们需要对xml文档进行验证时,这时候就需要创建相应的xml文档类型,来验证该文档是否符合有效性。LINQ TO XML中用XDcoumentType类来创建xml文档类型。如下声明:
<!DOCTYPE note SYSTEM "Sprites.dtd">
其中Sprites.dtd文档就是用来规定该xml文档是否符合dtd文档中描述的格式,从而来判定其是否有效。DTD(文档类型定义)正是让xml文件能成为数据交换标准,只要不同的公司定义好标准dtd,那么这些公司都能依这个dtd来建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。 dtd文档类型定义可以声明与xml文档中,也可以单独作为一个文档,在xml文档中去调用它。一般dtd文档中的语句是被包装在一个DOCTYPE声明中。
有时在创建xml文档时,要引用css文档来定义xml文档内容的表现形式,这时候就需要创建相应的XML处理指令。在LINQ TO XML中用XProcessingInstruction类来创建XML处理指令。如下声明方式:
<?xml-stylesheet href="Sprites.css" type="text/css">
这样xml文档在浏览器的表现形式就有样式文件Sprites.css来决定了。
假如现在我们要把这样一行数据"<H1>精灵</H1>"放在一个xml标签中,那么当这组xml数据在被解析器解析时,会把H1标签当作xml元素来看待,这时就违背了当初的意愿。这时就需要创建XML CData值,在LINQ TO XML中是用CData类来创建的,如果文本中有类似">"或"<"这样的字符时,就需要放到CData标签中去。只要是在CData标签中的文本都被解析器忽略。
一个xml文档创建好了XML声明,文档类型或处理指令,接下来就要创建xml文档的主要部分了。其中xml文档中最主要的就是创建xml元素,在LINQ TO XML中是用XElement类来创建相应的xml元素的。该类的构造方法有很多种,而最常用的是下面两个:
①XElement(XName name, object content);
②XElement(XName name, params object[] content);
第一种原型限定了每个父节点只可能有一个子节点。其中参数content是表示xml元素的内容。相比较于第一种方法,第二种方法允许父节点可以包含多个子节点,该方法也体现了LINQ TO XML函数式的xml创建。
在上一节中有提到过,用LINQ TO XML建立xml文档除了用XElement类外,还有一种更加正式的方法:用XDocument来创建xml文档,为什么说它相对于XElement更加正式呢,因为用XDocumnt类建立xml文档可以包含一些与文档有关的信息,比如文档声明、文档类型定义等信息。
在xml文档的主要部分中除了xml元素必不可少之外,xml属性也是最常见到的。在LINQ TO XML中用XAttribute类来创建xml属性,它是关联到xml元素的名称—值类型,每一个XElement对象可以有多个XAttribute对象。
每种语言在它诞生的那一刻,都会伴随一种该语言的注释方法。xml也不例外,在LINQ TO XML中我们用XComment类来创建XML注释。
以上是用LINQ TO XML创建xml文档中的最主要的几个步骤。接下来按照这些创建步骤用示例来说明:
i.dtd文档:
1 <?xml version="1.0" encoding="GB2312"?>
2 <!ELEMENT Sprites (Sprite+)>
3 <!ELEMENT Sprite (Profession,Weapon)>
4 <!ELEMENT Profession (#PCDATA)>
5 <!ELEMENT Weapon (#PCDATA)>
6 <!ATTLIST Sprite Profession CDATA #FIXED "职业" Weapon CDATA #FIXED "武器">
ii.css样式文件:
1 Sprite
2 {
3 margin:5px;
4 display:block;
5 background-color:#999;
6 }
7
8 Profession
9 {
10 font-family : "宋体";
11 font-size :20pt;
12 color:#00C;
13 display:block;
14 text-align:center;
15 }
16
17 Weapon
18 {
19 font-family : "宋体";
20 font-size :20pt;
21 color:#0C0;
22 display:block;
23 text-align:center;
24 }
iii.xml文档创建过程:
1 static void Main(string[] args)
2 {
3 //创建XML文档
4 XDocument xml = new XDocument();
5
6 //创建XML声明
7 XDeclaration declaration = new XDeclaration("1.0", "GB2312", "no");//xml版本1.0,汉字编码,需要外部文档来解析
8
9 //创建XML文档类型
10 XDocumentType documenttype = new XDocumentType("Sprites",null,"Sprites.dtd",null);//外部解析文档Sprites.dtd
11
12 //创建XML处理指令
13 XProcessingInstruction instruction = new XProcessingInstruction("xml-stylesheet", "href=\"Sprites.css\" type=\"text/css\"");//引用Sprites.css文档来定义xml文档的表现形式
14
15 //创建XML CData值
16 XCData data1 = new XCData("<H1>法师<H1>");
17 XCData data2 = new XCData("<H1>道士<H1>");
18
19 //创建XML元素
20 XElement Sprites=new XElement("Sprites",
21 new XElement("Sprite",
22 new XElement("Profession", data1),
23 new XElement("Weapon", "魔杖")),
24 new XComment("用xml属性的方式创建xml元素"),//创建xml注释
25 new XElement("Sprite",
26 new XAttribute("Profession", "战士"),//创建xml属性
27 new XAttribute("Weapon", "屠龙刀")),//创建xml属性
28 new XElement("Sprite",
29 new XElement("Profession", data2),
30 new XElement("Weapon", "倚天剑")));
31
32 //指定xml文档声明
33 xml.Declaration = declaration;
34
35 //添加xml文档类型
36 xml.Add(documenttype);
37
38 //添加xml处理指令
39 xml.Add(instruction);
40
41 //添加xml元素
42 xml.Add(Sprites);
43
44 //保存xml文档
45 xml.Save(@"d:\\Sprites.xml");
46 }
iv.结果:
①所创建的xml文档内容:
1 <?xml version="1.0" encoding="gb2312" standalone="no"?>
2 <!DOCTYPE Sprites SYSTEM "Sprites.dtd">
3 <?xml-stylesheet href="Sprites.css" type="text/css"?>
4 <Sprites>
5 <Sprite>
6 <Profession><![CDATA[<H1>法师<H1>]]></Profession>
7 <Weapon>魔杖</Weapon>
8 </Sprite>
9 <!--用xml属性的方式创建xml元素-->
10 <Sprite Profession="战士" Weapon="屠龙刀"/>
11 <Sprite>
12 <Profession><![CDATA[<H1>道士<H1>]]></Profession>
13 <Weapon>倚天剑</Weapon>
14 </Sprite>
15 </Sprites>
②用IE浏览Sprites.xml文档: