Fdream's Blog
专注于WEB前端开发
Powered by Google

Silverlight中XmlReader解析XML的流程

6 未知 2007-11
Fdream 发表于 Silverlight, 已被阅读 14499 次, 评论 0 条
关键词:silverlight C# XML
[ 阅读字体大小: ]

在Silverlight 1.1中,C#只能用XmlReader这样一个非常轻量级的东西来解析XML,因此稍有不慎就会出现很多非常奇怪的错误,在这里对XML的解析做一个简单的流程介绍吧。

在对流式XML的解析中,XmlReader对XML节点进行一些区分,这些节点的类型包括:

引用内容:

public enum XmlNodeType

{

None = 0,

Element = 1,

Attribute = 2,

Text = 3,

CDATA = 4,

EntityReference = 5,

Entity = 6,

ProcessingInstruction = 7,

Comment = 8,

Document = 9,

DocumentType = 10,

DocumentFragment = 11,

Notation = 12,

Whitespace = 13,

SignificantWhitespace = 14,

EndElement = 15,

EndEntity = 16,

XmlDeclaration = 17,

}

其中常用到的有Element、Attribite、Text、CDATA、EndElement等。其中Element类型的节点为“<item>”形式,EndElement的的节点为“</item>”形式,而Text类型则可以为一对标记之间的文本内容或者节点之间的空格、换行等。

了解了这些,我们再来看怎么从一个XML文件流中找出自己想要的数据。首先假设有一个这样的XML数据流,其XML结构如下:

引用内容:

<root>

<item>

<Title>网球王子</Title>

<Catalog>热门动漫</Catalog>

<Author>OOboy.net</Author>

<Email />

<Modified>Thu, 16 Aug 2007 09:39:19 GMT</Modified>

</item>

<item>

<Title>越狱</Title>

<Catalog>海外剧场</Catalog>

<Author>OOboy.net</Author>

<Email />

<Modified>Thu, 16 Aug 2007 09:39:19 GMT</Modified>

</item>

</root>

我们用XmlReader的Create方法从这个Stream中创建了一个XmlReader对象,现在我们解析出想要的数据——item项目中的各个子项:Title、Catalog、Author、Email、Modified。

解析过程在下面代码的注释中:

引用内容:

//reader是一个XmlReader实例

//开始读取流,直到读完为止

//reader.Read()每次读取一个XML节点(XML节点的描述在本文开头)

while (reader.Read())

{

//如果该节点是一个开始节点,而且节点的名称叫做item

//那么我们继续读取item子树

if ((reader.IsStartElement()) && (reader.LocalName == "item"))

{

//创建一个新的Item对象,后面把数据保存到Item对象中

Item item = new Item();

//继续读取Item下面的内容

using (XmlReader itemReader = reader.ReadSubtree())

{

//开始读取Item下面的内容,知道读完Item子树为止

//当碰到节点</item>时会跳出循环

while (itemReader.Read())

{

//如果找到一个Element,我们就读取其中的值

//用这种节点可以忽略空格、回车等等

if (itemReader.NodeType == XmlNodeType.Element)

{

//如果是空节点,比如上文中的<Email />这样的节点

//此时读取下一个节点,否则会出错

if (itemReader.IsEmptyElement)

{

continue;

}

//如果不是空节点

//把节点的name记录下来

string nodeName = itemReader.Name;

//读取节点内地文本节点

itemReader.Read();

if (itemReader.NodeType == XmlNodeType.Text)

{

//根据节点的name,把值保存到Item对应的属性中

switch (nodeName.ToUpper())

{

case "TITLE":

item.title = itemReader.Value;

break;

case "CATALOG":

item.catalog = itemReader.Value;

break;

case "AUTHOR":

item.author = itemReader.Value;

break;

case "EMAIL":

item.email = itemReader.Value;

break;

case "MODIFIED":

item.modified = itemReader.Value;

break;

}

}

//读取完成,再读结束节点End Element

itemReader.Read();

}

}

}

}

}

Related articles 您可能对这些文章也感兴趣:
Related comments 与该文相关的评论:(我也想说几句)
Add a comment 我来说两句: 
禁止表情
禁止UBB
禁止图片
识别链接
识别关键字
表  情
arrow
用户名:   密码:  (匿名可不写) 同时注册?
验证码:   看不清?换个图片  看不清楚?换个图片

 
Copyright © 2005-2008,Fdream All Rights Reserved
Processed in 0.1250048 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号