上接稳扎稳打Silverlight(19) - 2.0通信之调用REST服务,处理JSON格式, XML格式, RSS/ATOM格式的数据

简介:
2、调用 REST 服务,返回 XML 数据
REST.cs(WCF创建的REST服务)
using System; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
 
using System.ServiceModel.Web; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
 
/// <summary> 
/// 提供 REST 服务的类 
/// 注:Silverlight只支持 GET 和 POST 
/// </summary> 
[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public  class REST 

         /// <summary> 
         /// 用于演示返回 XML(对象) 的 REST 服务 
         /// </summary> 
         /// <param name="name"></param> 
         /// <returns></returns> 
        [OperationContract] 
        [WebGet(UriTemplate =  "User/{name}/xml", ResponseFormat = WebMessageFormat.Xml)] 
         public User HelloXml( string name) 
        { 
                 return  new User { Name = name, DayOfBirth =  new DateTime(1980, 2, 14) }; 
        } 
 
         /// <summary> 
         /// 用于演示返回 XML(集合) 的 REST 服务 
         /// </summary> 
         /// <returns></returns> 
        [OperationContract] 
        [WebGet(UriTemplate =  "Users/xml", ResponseFormat = WebMessageFormat.Xml)] 
         public List<User> HelloXml2() 
        { 
                 return  new List<User>    
                {    
                         new User(){ Name =  "webabcd01", DayOfBirth =  new DateTime(1980, 1, 1) }, 
                         new User(){ Name =  "webabcd02", DayOfBirth =  new DateTime(1980, 2, 2) }, 
                         new User(){ Name =  "webabcd03", DayOfBirth =  new DateTime(1980, 3, 3) }, 
                }; 
        } 

 
Xml.xaml
<UserControl x:Class="Silverlight20.Communication.Xml" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" Width="600"> 

                <TextBox x:Name="txtMsgXml" Margin="5" /> 
                <TextBox x:Name="txtMsgXml2" Margin="5" /> 

        </StackPanel> 
</UserControl>
 
Xml.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
using System.Xml.Linq; 
using System.IO; 
 
namespace Silverlight20.Communication 

         public partial  class Xml : UserControl 
        { 
                 public Xml() 
                { 
                        InitializeComponent(); 
 
                         // 演示如何处理 XML(对象) 
                        XmlDemo(); 
 
                         // 演示如何处理 XML(集合) 
                        XmlDemo2(); 
                } 
 
                 /// <summary> 
                 /// 演示如何处理 XML(对象) 
                 /// </summary> 
                 void XmlDemo() 
                { 
                         // REST 服务的 URL 
                        Uri uri =  new Uri( "http://localhost:3036/REST.svc/User/webabcd/xml", UriKind.Absolute); 
 
                        // 实例化 WebClient 
                        System.Net.WebClient client = new System.Net.WebClient(); 
 
                        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xml_DownloadStringCompleted); 
                        client.DownloadStringAsync(uri); 
 
                        txtMsgXml.Text = "读取 XML(对象) 数据中。。。"
                } 
 
                void xml_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
                { 
                        if (e.Error != null
                        { 
                                // 发生错误的话,则打印出来 
                                txtMsgXml.Text = e.Error.ToString(); 
                                return
                        } 
 
                        // 将获得的字符串转换为 XML(对象) 
                        var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result); 
                        var ms = new MemoryStream(buffer); 
 
                        XElement xmlObject = XElement.Load(ms); 
 
                        txtMsgXml.Text = e.Result + "\r\n"
                        XNamespace ns = "http://webabcd.cnblogs.com/"; 
                        txtMsgXml.Text += string.Format("姓名: {0}, 生日: {1}"
                                (string)xmlObject.Element(ns + "Name"), 
                                ((DateTime)xmlObject.Element(ns + "DayOfBirth")).ToString("yyyy-MM-dd")); 
 
                        /*    
                         * 总结: 
                         * XElement - 表示一个 XML 元素 
                         *         XElement.Element - XML 元素内的 XML 元素 
                         *         XElement.Attribute - XML 元素内的 XML 属性 
                         *         XElement.Load(Stream) - 使用指定流创建一个 XElement 对象 
                         *         XElement.Parse(String) - 解析指定的 XML 字符串为一个 XElement 对象 
                         * XAttribute - 表示一个 XML 属性 
                         */
 
                } 
 
                /// <summary> 
                /// 演示如何处理 XML(集合) 
                /// </summary> 
                void XmlDemo2() 
                { 
                        // REST 服务的 URL 
                        Uri uri = new Uri("http://localhost:3036/REST.svc/Users/xml", UriKind.Absolute); 
 
                        // 实例化 WebClient 
                        System.Net.WebClient client = new System.Net.WebClient(); 
 
                        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xml2_DownloadStringCompleted); 
                        client.DownloadStringAsync(uri); 
 
                        txtMsgXml2.Text = "读取 XML(集合) 数据中。。。"
                } 
 
                void xml2_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
                { 
                        if (e.Error != null
                        { 
                                // 发生错误的话,则打印出来 
                                txtMsgXml2.Text = e.Error.ToString(); 
                                return
                        } 
 
                        // 将获得的字符串转换为 XML(集合) 
                        XDocument xmlObject = XDocument.Parse(e.Result); 
 
                        txtMsgXml2.Text = e.Result + "\r\n"
                        XNamespace ns = "http://webabcd.cnblogs.com/"; 
                        var obj = from p in xmlObject.Elements(ns + "ArrayOfUser").Elements(ns + "User"
                                            where p.Element(ns + "Name").Value == "webabcd02" 
                                            select new { Name = (string)p.Element(ns + "Name"), DayOfBirth = (DateTime)p.Element(ns + "DayOfBirth") }; 
                         
                        txtMsgXml2.Text += string.Format("姓名: {0}, 生日: {1}"
                                obj.First().Name, 
                                obj.First().DayOfBirth.ToString("yyyy-MM-dd")); 
 
 
                        /*    
                         * 总结: 
                         * LINQ to XML 相当的方便 
                         */
 
                } 
        } 
}
 
 
3、调用 REST 服务,返回 Rss/Atom 数据
Proxy.aspx.cs(返回指定的url地址的内容的服务)
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
 
public partial  class Proxy : System.Web.UI.Page 

         protected  void Page_Load( object sender, EventArgs e) 
        { 
                 // 获取某个 url 地址的 html 并在页面上输出 
 
                 string url = Request.QueryString[ "url"]; 
 
                System.Net.WebClient client =  new System.Net.WebClient(); 
                client.Encoding = System.Text.Encoding.UTF8; 
 
                Response.Write(client.DownloadString(url)); 
                Response.End(); 
        } 
}
 
RssAtom.xaml
<UserControl x:Class="Silverlight20.Communication.RssAtom" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
        <StackPanel HorizontalAlignment="Left" > 

                <TextBox x:Name="txtMsgRss" Width="600" Margin="5" /> 

                <StackPanel Orientation="Horizontal"> 
                 
                        <ListBox x:Name="list" Width="300" Margin="5" SelectionChanged="list_SelectionChanged"> 
                                <ListBox.ItemTemplate> 
                                        <DataTemplate> 
                                                <TextBlock Text="{Binding Title.Text}"></TextBlock> 
                                        </DataTemplate> 
                                </ListBox.ItemTemplate> 
                        </ListBox> 

                        <TextBlock x:Name="detail" Width="300" Margin="5" Text="{Binding Summary.Text}" TextWrapping="Wrap" /> 
                         
                </StackPanel> 
                 
        </StackPanel> 
</UserControl>
 
RssAtom.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
 
using System.Xml; 
using System.IO; 
using System.ServiceModel.Syndication; 
 
namespace Silverlight20.Communication 

         public partial  class RssAtom : UserControl 
        { 
                 public RssAtom() 
                { 
                        InitializeComponent(); 
 
                         // 演示如何处理 Rss/Atom 
                        RssDemo(); 
                } 
 
                 /// <summary> 
                 /// 演示如何处理 Rss/Atom 
                 /// </summary> 
                 void RssDemo() 
                { 
                         // 让一个代理页面去请求相关的 Rss/Atom(如果用Silverlight直接去请求,则需要在目标域的根目录下配置策略文件) 
                        Uri uri =  new Uri( "http://localhost:3036/Proxy.aspx?url=http://webabcd.cnblogs.com/rss", UriKind.Absolute); 
 
                        // 实例化 WebClient 
                        System.Net.WebClient client = new System.Net.WebClient(); 
 
                        client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(rss_DownloadStringCompleted); 
                        client.DownloadStringAsync(uri); 
 
                        txtMsgRss.Text = "读取 RSS 数据中。。。"
                } 
 
                void rss_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
                { 
                        if (e.Error != null
                        { 
                                // 发生错误的话,则打印出来 
                                txtMsgRss.Text = e.Error.ToString(); 
                                return
                        } 
 
                        // 将获得的字符串转换为 XmlReader 
                        var buffer = System.Text.Encoding.UTF8.GetBytes(e.Result); 
                        var ms = new MemoryStream(buffer); 
                        XmlReader reader = XmlReader.Create(ms); 
 
                        // 从指定的 XmlReader 中加载,以生成 SyndicationFeed 
                        SyndicationFeed feed = SyndicationFeed.Load(reader); 
 
                        // 设置 list 的数据源为 Rss/Atom 的项集合(SyndicationFeed.Items) 
                        list.ItemsSource = feed.Items; 
                        txtMsgRss.Text = e.Result + "\r\n"
                } 
 
                private void list_SelectionChanged(object sender, SelectionChangedEventArgs e) 
                { 
                        // 设置 detail 的数据上下文为 Rss/Atom 的指定项(SyndicationItem) 
                        detail.DataContext = list.SelectedItem as SyndicationItem; 
                } 
        } 
}
 




     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/343113 ,如需转载请自行联系原作者
相关文章
|
1月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
161 0
|
5月前
|
XML 存储 数据格式
抖音卡片链接生成器,xml卡片数据支持快手,通过XPOSED实现制作
本项目介绍抖音/快手卡片链接生成技术,包含技术原理与核心功能实现。通过Xposed框架Hook目标APP关键方法,自定义卡片生成与跳转逻辑。卡片数据以XML格式存储,便于解析和跨平台使用。提供完整代码示例,涵盖Xposed模块配置、XML数据结构、Hook实现及卡片生成器核心类。下载地址:https://www.pan38.com/share.php?code=DuNzA,提取码:8888(仅供学习参考)。
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
422 7
使用Java和XPath在XML文档中精准定位数据
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
192 1
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
237 1
|
XML JSON 数据处理
C# 中的 XML 与 JSON 数据处理
在现代软件开发中,数据交换和存储需求日益增长,XML 和 JSON 成为最常用的数据格式。本文从 C# 角度出发,详细介绍如何处理这两种格式,并提供示例代码。对于 XML,我们介绍了读取、创建和写入 XML 文件的方法;对于 JSON,则展示了如何使用 Newtonsoft.Json 库进行数据解析和序列化。此外,文章还总结了常见问题及其解决方案,帮助开发者更好地应对实际项目中的挑战。
378 61
C# 中的 XML 与 JSON 数据处理
|
XML JSON 数据可视化
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
本文详细介绍了不同数据集格式之间的转换方法,包括YOLO、VOC、COCO、JSON、TXT和PNG等格式,以及如何可视化验证数据集。
3280 1
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
|
XML Web App开发 数据格式
HTML 页面显示 XML 数据
10月更文挑战第2天
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
2342 0
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
499 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧