1

こんにちは、リストビュー ラベル テキストを取得して、SQL データソースから取得した XML データを表示しようとしています。これまでのところ、codebehind/javascript での文字列操作によってこれを行うことができました。私は初心者ですが、これを達成する他の方法があるかどうか知りたいですか?

私のXmlファイルは次のようになります

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

最終結果が

<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 以外の方法はありますか?

4

1 に答える 1

1

個人的には、XML の文字列操作/解析をゼロから行うことは決してありません。多くの言語とフレームワークには、それを処理する多くの組み込みユーティリティがあります。

以下は、希望するものと同様の XML データを表示するための 3 つの方法です。希望どおりにするには、これを変更する必要がありますが、かなり良いアイデアが得られるはずです。方法 3 が最も近いと思われますが、シナリオに最適な方法を使用できるように、できるだけ多くのオプションを把握しておくことをお勧めします。

方法 1:

Web ページに 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>

アーティスト.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:

これはおそらくあなたが望むものです。これは、App_Data フォルダーにある artist.xml にも依存しています。

デフォルト.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();
        }
    }
}
于 2013-10-03T17:15:21.783 に答える