Silverlight网络编程与XML数据处理全解析
立即解锁
发布时间: 2025-08-26 01:35:17 阅读量: 14 订阅数: 45 AIGC 


Silverlight 4 in VB: 创建跨平台浏览器应用
### Silverlight网络编程与XML数据处理全解析
#### 1. 简单Web服务调用的挑战
在Silverlight中,调用简单Web服务比调用基于SOAP的Web服务要更麻烦。这是因为Silverlight无法为简单Web服务生成代码,简单Web服务缺乏自我描述性,缺少能让开发工具(如Visual Studio)生成部分所需代码的底层文档细节。
#### 2. 使用网络凭据
WebClient和WebRequest类允许在Web请求中传递网络凭据(用户名和密码),从而访问需要身份验证的安全Web服务器。具体操作步骤如下:
1. 调用共享的WebRequest.RegisterPrefix()方法,确保使用客户端HTTP堆栈:
```vb
WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp)
```
2. 设置WebClient或WebRequest对象的UseDefaultCredentials属性和Credentials属性。以下是WebRequest类的示例:
```vb
Dim request As WebRequest = WebRequest.Create(address)
request.UseDefaultCredentials = False
request.Credentials = New NetworkCredential("username", "password")
```
设置完这些属性后,就可以正常使用WebRequest或WebClient对象与Web服务器进行通信。
#### 3. 处理不同类型的数据
从Web获取的数据通常有普通文本数据(来自静态文件或Web服务动态生成),如果文本包含HTML标记,还可以进行搜索。但从编程角度看,纯文本和HTML难以解析,更多时候会处理更复杂的结构化数据。返回结构化数据的Web服务通常采用标准化格式,如普通XML、SOAP消息或JSON,Silverlight支持这三种格式。
#### 4. XML数据处理
许多简单Web服务以XML格式返回数据,在使用这类服务时,需要决定如何处理XML。Silverlight提供了几种处理XML的方式:
|处理方式|描述|
| ---- | ---- |
|XmlWriter和XmlReader|提供了处理XML的基础方法,功能最少。可以逐个元素地读写XML内容。|
|XmlSerializer|可将活动对象转换为XML表示,反之亦然。但XML必须遵循类的结构。使用时需要引用System.Xml.Serialization.dll程序集。|
|XDocument|是LINQ to XML的基础,比XmlSerializer更灵活。使用合适的LINQ表达式,可以过滤出所需的细节并更改内容结构。使用时需要引用System.Xml.Linq.dll程序集。|
一般来说,大多数Silverlight应用程序使用更高级的XmlSerializer和XDocument类更好。例外情况是需要处理大量XML且想避免一次性将其全部加载到内存中,此时可能需要使用XmlWriter和XmlReader进行逐位处理。在XmlSerializer和XDocument之间,如果能完全控制数据格式,XmlSerializer是合理的选择;但XDocument更灵活,在处理他人的XML(如从Web服务检索数据)时特别有用。需要注意的是,Silverlight不包含使用XML DOM模型的类(如.NET中的XmlDocument类),如果要进行内存中的XML处理,使用更精简高效的XDocument更好。
#### 5. 返回XML数据的服务
Flickr是一个提供类似REST服务的图像共享网站,通过在URL末尾添加查询字符串参数来提供参数,其Web服务以XML格式返回响应。例如,Flickr请求的查询字符串参数包括:
- method:表示执行的操作类型。
- tags:搜索关键字。
- perpage:要检索的结果数量。
- api_key:用于访问Flickr服务的唯一ID。
可以使用更多参数来获取多页结果、进行排序、按日期过滤等。获取更多信息和免费API密钥可访问www.flickr.com/services/api。示例请求URL如下:
```
http://api.flickr.com/services/rest/?method=flickr.photos.search&tags=frog&api_key=...&perpage=10
```
由于所有输入参数都通过URL传递,无需进行POST操作,可以使用更简单的WebClient而不是WebRequest。以下是构建Flickr请求URL并触发异步操作获取结果的代码:
```vb
Private Sub cmdGetData_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim client As New WebClient()
Dim address As New Uri("http://api.flickr.com/services/rest/?" & _
"method=flickr.photos.search" & "&tags=" & _
HttpUtility.UrlEncode(txtSearchKeyword.Text) & _
"&api_key=..." & "&perpage=10")
AddHandler client.DownloadStringCompleted, _
AddressOf client_DownloadStringCompleted
client.DownloadStringAsync(address)
End Sub
```
HttpUtility.UrlEncode()方法确保搜索字符串中的非URL友好字符被替换为相应的字符实体。结果以单个长字符串形式检索,包含如下格式的XML:
```xml
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<photos page="1" pages="1026" perpage="100" total="102577">
<photo id="2519140273" owner="85463968@N00" secret="9d215a1b8b" server="2132"
farm="3" title="He could hop in, but he couldn't hop out" ispublic="1"
isfriend="0" isfamily="0" />
<photo id="2519866774" owner="72063229@N00" secret="05bccd89cd" server="2353"
farm="3" title="Small Frog on a Leaf" ispublic="1" isfriend="0" isfamily="0" />
...
</photos>
</rsp>
```
解析这些信息的第一步是将整个文档加载到新的XDocument对象中。XDocument类提供了两个共享方法:Load()方法从XmlReader中提取内容,Parse()方法从字符串中提取内容。当WebClient.DownloadStringCompleted事件触发时,使用Parse()方法:
```vb
Dim document As XDocument = XDocument.Parse(e.Result)
```
获取XDocument对象后,可以采用以下两种策略提取所需信息:
- **遍历XDocument**:
XDocument包含XNode对象集合,XNode是必须继承的基类,XElement、XComment和XText等更具体的类从它派生,用于表示元素、注释和文本内容。属性不作为单独的节点处理,而是作为附加到元素的简单名值对。可以使用XElement类的一些关键属性和方法深入节点树,常用方法如下:
|方法|描述|
| ---- | ---- |
|Attributes()|获取此元素的XAttribute对象集合。|
|Attribute()|获取具有特定名称的XAttribute(如果没有匹配项则为Nothing)。|
|Elements()|获取此元素包含的XElement对象集合(仅顶级元素,这些元素可能包含更多元素)。可以选择指定元素名称,仅检索这些元素。|
|Element()|获取此元素中具有特定名称的XElement(如果没有匹配项则为Nothing)。如果有多个匹配元素,则返回第一个。|
|Nodes()|获取此元素包含的所有XNode对象,包括元素和其他内容(如注释)。|
在Flickr示例中,顶级元素是`<rsp>`,可以这样访问:
```vb
Dim element As XElement = document.Element("rsp")
```
要获取`<rsp>`元素内的`<photos>`元素,可以分两步:
```vb
Dim rspElement As XElement = document.Element("rsp")
Dim photosElement As XElement = rspElement.Element("photos")
```
也可以一步完成:
```vb
Dim photosElement As XElement = document.Element("rsp").Element("photos")
```
要获取`<photos>`元素内的`<photo>`元素,使用Elements()方法:
```vb
Dim elements As IEnumerable(Of XElement)
elements = document.Element("rsp").Element("photos").Elements()
```
每个`<photo>`元素的属性包含所需的所有信息,要获取Flickr图像(可以使用Image元素显示),需要以正确的格式组合信息来构造URL:
```vb
Private Sub client_DownloadStringCompleted(ByVal sender As Object, _
ByVal e As DownloadStringCompleted
```
0
0
复制全文
相关推荐










