探索Silverlight中的网络编程与XML数据处理
立即解锁
发布时间: 2025-08-26 01:18:45 阅读量: 18 订阅数: 21 AIGC 

### 探索Silverlight中的网络编程与XML数据处理
在网络编程的世界里,处理不同类型的数据是一项常见且重要的任务。Silverlight作为一种技术,在处理网络数据方面有着独特的方式,尤其是在处理XML数据时,提供了多种灵活的解决方案。本文将深入探讨Silverlight中网络编程与XML数据处理的相关知识。
#### 1. Silverlight网络编程基础
在Silverlight中调用简单的Web服务比调用基于SOAP的Web服务更为复杂,因为Silverlight无法为你生成代码。简单Web服务虽然调用起来相对容易,但缺乏自描述性,这使得开发工具(如Visual Studio)难以自动生成所需的代码。
在处理网络请求时,`BeginGetResponse()` 的回调函数在后台线程上运行。如果要与元素进行交互,需要使用 `Dispatcher.BeginInvoke()` 将调用封送到前台线程。以下是实现该功能的代码示例:
```csharp
// Update the display.
Dispatcher.BeginInvoke(
delegate()
{
lblResult.Text = result;
});
```
#### 2. 处理不同类型的数据
到目前为止,我们已经了解了如何从Web检索普通文本数据,无论是来自静态文件还是由Web服务动态生成的。然而,从编程的角度来看,纯文本和HTML都有局限性,因为它们难以解析。更多时候,我们需要处理更复杂的结构化数据。返回结构化数据的Web服务通常采用标准化格式,如普通XML、SOAP消息或JSON,Silverlight支持所有这三种格式。
#### 3. XML数据处理
许多简单的Web服务以XML格式返回数据。在使用这类服务时,需要决定如何处理XML。Silverlight提供了几种处理XML的选项:
- **XmlWriter和XmlReader**:这两个类提供了处理XML的基础方法,功能最少。使用它们可以一次读写一个XML元素。
- **XmlSerializer**:该类允许将活动对象转换为XML表示形式,反之亦然。唯一的限制是XML必须遵循类的结构。要使用 `XmlSerializer`,需要引用 `System.Xml.Serialization.dll` 程序集。
- **XDocument**:这是LINQ to XML的基础类。它允许转换XML对象,并且比 `XmlSerializer` 更灵活。使用合适的LINQ表达式,可以过滤出所需的详细信息并更改内容的结构。要使用 `XDocument`,需要引用 `System.Xml.Linq.dll` 程序集。
下面是对这三种方法的详细比较:
| 方法 | 优点 | 缺点 | 适用场景 |
| --- | --- | --- | --- |
| XmlWriter和XmlReader | 适合处理大量XML数据,避免一次性将所有数据加载到内存中 | 功能最少,需要手动跟踪结构,只能向前遍历 | 处理大量XML数据,对内存使用有严格要求 |
| XmlSerializer | 当完全控制数据格式时,使用方便 | XML必须遵循类的结构 | 完全控制数据格式,不需要遵循特定XML格式 |
| XDocument | 提供更多灵活性,可将XML视为元素集合或转换为对象集合 | 需要引用额外的程序集 | 处理他人提供的XML数据,如从Web服务检索的数据 |
一般来说,大多数Silverlight应用程序使用更高级的 `XmlSerializer` 和 `XDocument` 类会更好。唯一的例外是需要处理大量XML数据并希望避免一次性将其全部加载到内存中的情况,此时可能需要使用 `XmlWriter` 和 `XmlReader` 进行逐位处理。
#### 4. 返回XML数据的服务 - Flickr示例
Flickr是一个提供类似REST服务的图像共享网站。通过在URL末尾添加查询字符串参数来提供参数,Flickr Web服务以XML格式返回响应。
##### 4.1 Flickr请求参数
Flickr请求包含以下查询字符串参数:
- `method`:指示正在执行的操作类型。
- `tags`:搜索关键字。
- `perpage`:要检索的结果数量。
- `api_key`:用于访问Flickr服务的唯一ID。
可以使用更多参数来获取多页结果、应用排序、按日期过滤等。要获取更多信息并获取自己的免费API密钥,请访问 [http://www.flickr.com/services/api](http://www.flickr.com/services/api)。
##### 4.2 构建Flickr请求URL
由于所有输入参数都通过URL传递,因此无需进行POST操作,可以使用更简单的 `WebClient` 而不是 `WebRequest`。以下是构建Flickr请求URL并触发异步操作以获取结果的代码:
```csharp
private void cmdGetData_Click(object sender, RoutedEventArgs e)
{
WebClient client = new WebClient();
Uri address = new Uri("http://api.flickr.com/services/rest/?" +
"method=flickr.photos.search" + "&tags=" +
HttpUtility.UrlEncode(txtSearchKeyword.Text) +
"&api_key=..." + "&perpage=10");
client.DownloadStringCompleted += client_DownloadStringCompleted;
client.DownloadStringAsync(address);
}
```
`HttpUtility.UrlEncode()` 方法确保搜索字符串中的任何非URL友好字符都被替换为相应的字符实体。
##### 4.3 解析Flickr返回的XML数据
Flickr返回的结果是一个包含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()` 方法:
```csharp
XDocument document = XDocument.Parse(e.Result);
```
##### 4.4 导航XDocument
每个 `XDocument` 都包含一个 `XNode` 对象的集合。`XNode` 是一个抽象基类,其他更具体的类(如 `XElement`、`XComment` 和 `XText`)从它派生而来,用于表示元素、注释和文本内容。属性是个例外,它们不被视为单独的节点,而是作为附加到元素的简单名值对处理。
`XElement` 类提供了一些关键属性和方法,用于深入挖掘节点树。以下是 `XElement` 类的一些基本方法:
| 方法 | 描述 |
| --- | --- |
| `Attributes()` | 获取此元素的 `XAttribute` 对象集合。 |
| `Attribute()` | 获取具有特定名称的 `XAttribute`(如果没有匹配项,则返回 `null`)。 |
| `Elements()` | 获取此元素包含的 `XElement` 对象集合。(这只是顶级元素 - 这些元素可能又包含更多元素。)可以选择指定元素名称,仅检索那些元素。 |
| `Element()` | 获取此元素包含的具有特定名称的 `XElement`(如果没有匹配项,则返回 `null`)。如果有多个匹配元素,则返回第一个。 |
| `Nodes()` | 获取此元素包含的所有 `XNode` 对象。这包括元素和其他内容,如注释。 |
在Flickr示例中,顶级元素是 `<rsp>`,可以通过以下方式访问它:
```csharp
XElement element = document.Element("rsp");
```
要获取 `<rsp>` 元素内的 `<p
0
0
复制全文
相关推荐










