none
在Silverlight中处理XML数据 RRS feed

  • 常规讨论

  • 本章中的QuickStart 示例演示如何使用Silverlight中的 .NET Framework 子集部分来得到远程的 XML内容, 使用XmlReader来读入内容, 以及使用StringBuilder 和 XmlWriter来将内容输出到XAML 中.

    运行 查看 想要在基于Silverlight的应用程序中做到以上的功能,你需要准备以下步骤:

    使用BrowserHttpWebRequest来得到远程 XML源 .

    使用XmlReader来读取XML文件.

    使用XmlWriter来将XML内容写入到一个StringBuilder 对象中.

    输出XAML内容到页中.

    要求 (available from the Silverlight download site):

    Microsoft Silverlight 1.1 Alpha.

    Microsoft Visual Studio Code Name "Orcas" Beta 1.

    Microsoft Silverlight Tools Alpha for Visual Studio Code Name "Orcas" Beta 1.

    A Silverlight project. For instructions, see How to: Create a Silverlight Project.

    使用BrowserHttpWebRequest来得到远程XML内容
    创建一个 BrowserHttpWebRequest 实例,并将你想要调用的资源的Uniform Resource Identifier (URI)传入. 你可以请求一个在同一个服务器上的文件. 例如, 你可以得到示例中的rssfeed.xml 文件(单击查看源文件按钮)然后复制到你project中的 source文件夹中.

    CS
    HttpWebRequest request = new BrowserHttpWebRequest(new Uri(url));

     

    VB

    Dim request As New BrowserHttpWebRequest(New Uri(url))



    注意
    如果想得到不同域中的 XML document ,请使用Web service. 想了解如何使用Web service, 查看 Exposing Web Services to Client Script in ASP.NET AJAX.

    调用GetResponse 方法来得到HttpWebResponse 对象,它包含了你请求资源的响应.

    CS

    HttpWebResponse response = request.GetResponse();

    VB

    Dim response = request.GetResponse()

     

    使用 HttpWebResponse.GetResponseStream 方法以流的方式得到服务器对你请求的响应.

    CS
    Stream content = response.GetResponseStream();

    VB
    Dim content = response.GetResponseStream()

    在你得到response 对象后, 请以Close() 方法来关闭这个资源请求.

    CS
    response.Close();

    VB
    response.Close()

    使用XMLReader来读取XML
    调用Create() 方法然后给它传入一个StreamReader 类的实例,这样你就创建了一个XmlReader 对象.

    CS
    using (XmlReader reader = XmlReader.Create(new StreamReader(content)))

    VB
    Using reader As XmlReader = XmlReader.Create(New StreamReader(content))

    开始读取这个包含返回内容的stream.

    CS
    while (reader.Read())

    VB
    While (reader.Read())

    寻找名称为"item"的元素.它表明 RSS feed item 就在当前节点中.

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

    VB
    If ((reader.IsStartElement()) And ("item" = reader.LocalName)) Then

    创建一个 XmlReader类型的itemReader 对象,使用XmlReader的 ReadSubTree() 方法来访问所有的"item" 元素. itemReader即能得到所有当前的 RSS item数据.

    CS
    using (XmlReader itemReader = reader.ReadSubtree())

    VB
    Using itemReader As XmlReader = reader.ReadSubtree()

    调用itemReader对象的Read() 方法在RSS feed中来搜索"title" 和 "link" 元素 .

    while (itemReader.Read())
    {
    if (itemReader.IsStartElement())
    {
    if ("title" == itemReader.LocalName)
    {
    }
    else if ("link" == itemReader.LocalName)
    {
    }
    }
    }
    While itemReader.Read()
    If (itemReader.IsStartElement()) Then
    If ("title" = itemReader.LocalName) Then
    ElseIf ("link" = itemReader.LocalName) Then
    End If
    End If
    End While你不需要调用reader 和 itemReader的Close 方法,因为 using 申明定义的对象将在括号结束时自动disposed.

    使用XMLWriter来写XML成为一个StringBuilder object
    创建一个XmlWriter 并传入一个它将要写入内容并用来代表XAML内容的 StringBuilder 对象.

    CS
    StringBuilder xamlString = new StringBuilder();
    using (XmlWriter writer = XmlWriter.Create(xamlString))

    VB
    Dim xamlString As New StringBuilder()
    Using writer As XmlWriter = XmlWriter.Create(xamlString)

    注意
    你可以使用XamlWriter 来创建XAML 控件, 或者你有了XmlWriter 对象,你可以改变它为 XamlWriter.

    写入 XAML 元素. 在writer结束时, 你可以将这些元素控件添加到XAML页中. 下面的示例添加了 Canvas 元素.它同时还添加了TextBlock 子元素到 Canvas 下. TextBlock 元素必须含有 Canvas.Top 参数来定位它在 Canvas对象的什么位置上. 你同样还要设置它显示出来的值.

    // Write Canvas element.
    writer.WriteStartElement("Canvas");
    // Write child elements for Canvas.
    writer.WriteStartElement("TextBlock");
    writer.WriteAttributeString("Canvas.Top", 0);
    writer.WriteAttributeString("Text",
    "Title: " + itemReader.ReadElementContentAsString());
    // End TextBlock element.
    writer.WriteEndElement();
    // End Canvas element.
    writer.WriteEndElement();
    ' Write Canvas element.
    writer.WriteStartElement("Canvas")
    ' Write child elements for Canvas.
    writer.WriteStartElement("TextBlock")
    writer.WriteAttributeString("Canvas.Top", 0)
    writer.WriteAttributeString("Text", _
    "Title: " & itemReader.ReadElementContentAsString())
    ' End TextBlock element.
    writer.WriteEndElement()
    ' End Canvas element.
    writer.WriteEndElement()
    调用Flush() 方法来flush xamlString.缓冲的内容

    CS
    writer.Flush();

    VB
    writer.Flush()

    你不需要调用writer 的 Close 方法,因为using申明定义的对象将在括号结束时自动disposed.

    将内容写入 XAML 页
    从string中来创建一个XAML controls.

    CS
    System.Windows.DependencyObject controls =
    XamlReader.Load(xamlString.ToString());

    VB
    Dim controls As System.Windows.DependencyObject = _
    XamlReader.Load(xamlString.ToString())

    添加 controls 到根 Canvas的子对象集中.

    CS
    this.Children.Add(controls as Visual);

    VB
    Me.Children.Add(controls)

    原文地址

    1
    2009年5月27日 6:39