如何在ASP.net中的LABEL文本中将从SQL数据源获取的XML数据显示为html

时间:2013-06-04 18:16:50

标签: asp.net xml

您好我希望获取Listview标签文本以显示从SQL数据源获取的XML数据。到目前为止,我已经通过codebehind / javascript中的字符串操作实现了这一目标。我是一个菜鸟,想知道是否有其他方法可以达到这个目的?

我的Xml文件看起来像这样

<?xml ver="1-0" encoding="utf-8"?>
<artists>
<artist>
<name>fatfinger</name>
<id>1</id>
<artist>
<artist>.....</artist>
.
.
.
</artists>

我正在操作后面的代码(ONDATABIND Event)中的字符串,以便最终结果是

<asp:label id="label1" runat="server" text="String manipulation output here"

字符串操作输出

<div class="artists"> <a class="artist" href="http://myweb.com/id">artist</a></div>

这种做法是否正确?或者除了javascript之外还有其他方法可以达到相同的最终结果吗?

1 个答案:

答案 0 :(得分:1)

我个人从不尝试从头开始对XML进行字符串操作/解析。许多语言和框架中都有许多内置实用程序可以为您处理。

以下三种方法可以显示类似于您想要的XML数据。您仍然需要对其进行修改以完全按照您的要求进行操作,但这些应该会给您一些非常好的想法。方法3可能是最接近的,但最好知道尽可能多的选项,以便您使用最佳方法。

方法1:

当我必须在网页中显示xml数据时,我更喜欢使用XSLT。但是,这样做假定您的用户正在使用兼容XSLT的浏览器。

artist.xml - 此文件在xml文件中包含一个引用。

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="artist.xsl"?>
<artists>
    <artist>
        <id>1</id>
        <name>Chuck Berry</name>
    </artist>
    <artist>
        <id>2</id>
        <name>Blackfoot</name>
    </artist>
    <artist>
        <id>3</id>
        <name>Trixter</name>
    </artist>
    <artist>
        <id>4</id>
        <name>D'Molls</name>
    </artist>
    <artist>
        <id>5</id>
        <name>The Runaways</name>
    </artist>
</artists>

artist.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <ul>
                <xsl:for-each select="artists/artist">
                    <li><xsl:value-of select="name"/></li>
                </xsl:for-each>
                </ul>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

方法2:

这完成了与上面相同的事情,除了它依赖.Net进行转换。它似乎在浏览器中更可靠地显示。可以在此处找到更强大的示例:http://support.microsoft.com/kb/315906

为此,我创建了一个简单的c#WebForms项目,并将xml和xsl文件放在App_Data文件夹中。我还从xml文件中删除了样式表引用。

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SandboxWeb._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Test!
    </h2>
    <asp:Xml id="Xml1" runat="server" DocumentSource="~/App_Data/artist.xml" TransformSource="~/App_Data/artist.xsl"></asp:Xml>
</asp:Content>

方法3:

这可能是你想要的。这也依赖于artist.xml在App_Data文件夹中。

Default.aspx的

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="SandboxWeb._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Test!
    </h2>

    <asp:Repeater ID="repeater1" runat="server">
        <ItemTemplate>
            <p>
                <asp:Label Id="lblName" runat="server" Text="<%# Container.DataItem %>" />
            </p>
        </ItemTemplate>
    </asp:Repeater>
</asp:Content>

Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

using System.Xml.Linq;

namespace SandboxWeb {
    public partial class _Default : System.Web.UI.Page {
        private XDocument xmlDoc;
        public List<String> ArtistNames { get; set; }

        protected void Page_Load(object sender, EventArgs e) {
            ArtistNames = new List<String>();

            xmlDoc = XDocument.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data/artist.xml"));

            ArtistNames = (from a in xmlDoc.Root.Descendants("artist") select a.Element("name").Value).ToList<String>();

            repeater1.DataSource = ArtistNames;
            repeater1.DataBind();
        }
    }
}