最近在wrox的网站上下了很多代码,一直没时间来看,碰好今天是星期天,闲下来看看里面的代码学点东西.wrox的例子总是循序渐进,所以很容易理解.
一.创建XML读取器.
在.net2.0中用新的方法Create()创建XML实例
第一个例子读取,XML文件的元素值,如<item>
1
<%@ Page Language="C#" %>
2
<%@ Import Namespace="System.Xml" %>
3
<script runat="server">
4
void Page_Load(object sender, EventArgs e)
5
{
6
//XML文件路径
7
string xmlFilePath = Request.PhysicalApplicationPath + @"/Employees.xml";
8
try
9
{
10
//创建XmlReader实例
11
using (XmlReader reader = XmlReader.Create(xmlFilePath))
12
{
13
string result;
14
while (reader.Read())
15
{
16
17
//判断节点类型
18
if (reader.NodeType == XmlNodeType.Element)
19
{
20
21
result = "";
22
Response.Write(reader.Depth + "<br>");
23
//根据深度,显示效果
24
for (int count = 1; count <= reader.Depth; count++)
25
{
26
27
result += "==";
28
}
29
//返回节点的限定名
30
result += "=> " + reader.Name + "<br/>";
31
lblResult.Text += result;
32
}
33
}
34
}
35
}
36
catch (Exception ex)
37
{
38
lblResult.Text = "发生错误: " + ex.Message;
39
}
40
}
41
42
</script>
43
44
<html xmlns="http://www.w3.org/1999/xhtml" >
45
<head runat="server">
46
<title>利用XmlReader读取XML</title>
47
</head>
48
<body>
49
<form id="form1" runat="server">
50
<div>
51
<asp:label id="lblResult" runat="server" />
52
</div>
53
</form>
54
</body>
55
</html>
56
显示效果如下
首先创建XmlReader实例
根据reader.Depth深度值返回值其name,Depth就是是返回元素从跟节点开始所在的位置,如下面的XML文件
<?
xml version='1.0'
?>
<
employees
>
<
employee
id
="1"
>
<
name
>
<
firstName
>
Nancy
</
firstName
>
<
lastName
>
Davolio
</
lastName
>
</
name
>
<
city
>
Seattle
</
city
>
<
state
>
WA
</
state
>
<
zipCode
>
98122
</
zipCode
>
</
employee
>
<
employee
id
="2"
>
<
name
>
<
firstName
>
Andrew
</
firstName
>
<
lastName
>
Fuller
</
lastName
>
</
name
>
<
city
>
Tacoma
</
city
>
<
state
>
WA
</
state
>
<
zipCode
>
98401
</
zipCode
>
</
employee
>
</
employees
>
emplpyees的depth为0,emplyoee的depth为1,name的德depth为2,firstName和lastName的depth为3
下面看一下name属性
name获取当前节点的限定名,返回的名称取决于节点的 NodeType,上面的 NodeType类型为Element(标记名),所以返回标记名.
接着继续看第二个例子,读取标记中的属性,根据上面的例子延伸
<%
@ Page Language
=
"
C#
"
%>
<%
@ Import Namespace
=
"
System.Xml
"
%>
<
script runat
=
"
server
"
>
void
Page_Load(
object
sender, EventArgs e)

{
//XML文件路径
string xmlFilePath = Request.PhysicalApplicationPath + @"/Employees.xml";
try

{
//创建XmlReader实例
using (XmlReader reader = XmlReader.Create(xmlFilePath))

{
string result;
while (reader.Read())

{
//判断节点类型
if (reader.NodeType == XmlNodeType.Element)

{
result = "";
for (int count = 1; count <= reader.Depth; count++)

{
result += "===";
}
result += "=> " + reader.Name;
lblResult.Text += result;
// 判断节点是否有属性存在
if (reader.HasAttributes)

{
lblResult.Text += " (";
Response.Write("<br>"+reader.AttributeCount);
for (int count = 0; count < reader.AttributeCount; count++)

{
//索引属性
reader.MoveToAttribute(count);
lblResult.Text += reader.Name+",";
}
lblResult.Text += ")";
//索引当前属性节点
reader.MoveToElement();
}
lblResult.Text += "<br/>";
}
}
}
}
catch (Exception ex)

{
lblResult.Text = "发生错误: " + ex.Message;
}
}
</
script
>

<
html xmlns
=
"
http://www.w3.org/1999/xhtml
"
>
<
head runat
=
"
server
"
>
<
title
>
读取XML属性
</
title
>
</
head
>
<
body
>
<
form id
=
"
form1
"
runat
=
"
server
"
>
<
div
>
<
asp:label id
=
"
lblResult
"
runat
=
"
server
"
/>
</
div
>
</
form
>
</
body
>
</
html
>
这个例子比上面多了几行代码,从判断节点属性是否存在开始.获取属性数AttributeCount,
然后根据属性位置MoveToAttribute()返回属性名称. 最后还有一个reader.MoveToElement()方法,当在派生类中被重写时,移动到包含当前属性节点的元素
其返回一个布尔值 如果拿掉这句话以Response.Write(reader.MoveToElement());代替的话,其值为true表示读取器定位在属性上,
添加这个方法的话返回值为false即读取器不是定位在属性上
reader.MoveToElement();
Response.Write(reader.MoveToElement());
大家可以测试一下.了解上面几个属性和方法就应该明白怎么读取的了.
例子继续.
第三个例子继续深入,读取XML元素值和属性值,也先来看一下代码
1
<%@ Page Language="C#" %>
2
<%@ Import Namespace="System.Xml" %>
3
<script runat="server">
4
void Page_Load(object sender, EventArgs e)
5
{
6
//XML文件路径
7
string xmlFilePath = Request.PhysicalApplicationPath + @"/Employees.xml";
8
string employeeID = "";
9
try
10
{
11
//创建XmlReader实例
12
using (XmlReader reader = XmlReader.Create(xmlFilePath))
13
{
14
15
lblResult.Text = "<b>Employees</b>";
16
lblResult.Text += "<ul/>";
17
string result;
18
while (reader.Read())
19
{
20
if (reader.NodeType == XmlNodeType.Element)
21
{
22
if (reader.Name == "employee")
23
{
24
//读取属性值
25
employeeID = reader.GetAttribute("id");
26
}
27
if (reader.Name == "name")
28
{
29
lblResult.Text += "<li>" + "Employee - " + employeeID;
30
lblResult.Text += "<ul>";
31
lblResult.Text += "<li>ID - " + employeeID + "</li>";
32
}
33
if (reader.Name == "firstName")
34
{
35
//读取把节点内容以字符串形式读取
36
lblResult.Text += "<li>First Name - " + reader.ReadString() + "</li>";
37
}
38
if (reader.Name == "lastName")
39
{
40
lblResult.Text += "<li>Last Name - " + reader.ReadString() + "</li>";
41
}
42
if (reader.Name == "city")
43
{
44
lblResult.Text += "<li>City - " + reader.ReadString() + "</li>";
45
}
46
if (reader.Name == "state")
47
{
48
lblResult.Text += "<li>State - " + reader.ReadString() + "</li>";
49
}
50
if (reader.Name == "zipCode")
51
{
52
lblResult.Text += "<li>Zipcode - " + reader.ReadElementContentAsInt().ToString() + "</li>";
53
}
54
}
55
//末尾节点
56
else if (reader.NodeType == XmlNodeType.EndElement)
57
{
58
if (reader.Name == "employee")
59
{
60
61
lblResult.Text += "</ul>";
62
lblResult.Text += "</li>";
63
}
64
}
65
}
66
lblResult.Text += "</ul>";
67
}
68
}
69
catch (Exception ex)
70
{
71
lblResult.Text = "发生错误: " + ex.Message;
72
}
73
}
74
</script>
75
76
<html xmlns="http://www.w3.org/1999/xhtml" >
77
<head runat="server">
78
<title>读取属性值</title>
79
</head>
80
<body>
81
<form id="form1" runat="server">
82
<div>
83
<asp:label id="lblResult" runat="server" />
84
</div>
85
</form>
86
</body>
87
</html>
88
先熟悉几个方法
GetAttribute 方法 获取属性的值
ReadString 方法 将元素或文本节点的内容当做字符串读取
ReadElementContentAsInt 方法 读取当前元素并将内容作为 32 位有符号整数返回
这个例子是根据元素一个一个进行判断,再获取值的.最后还要判断是否XML文件结尾判断节点类型是否为EndElement末尾元素标记.
接着还有最后一个例子,其实是介绍XmlReaderSettings.
这个对象可以设定XML的一些功能.比如是否忽略空白,注释
1
XmlReaderSettings settings
=
new
XmlReaderSettings();
2
settings.IgnoreComments
=
true
;
3
settings.IgnoreWhitespace
=
true
;
4
XmlReader reader
=
XmlReader.Create(xmlFilePath, settings)
具体的还得看MSDN,可能我说的很多都不对,只是把自己学习的过程记录下来.也希望对大家有帮助