Как загрузить элемент XML в виде ссылки на GridView (asp.net)? - PullRequest
1 голос
/ 08 октября 2019

Мне нужно отобразить данные (элементы XML документа и «вручную») из файла XML в элемент управления GridView в виде ссылки. Единственный способ, который работает для меня, - это использование раздела CDATA (я использовал его для элемента «документ» ниже). Но мне нужно найти способ избежать использования CDATA для упрощения XML-файла. Это должно позволить мне сделать ссылку в виде строки в коде за файлом и оставить только название документа в файле .xml. Я попробовал другой способ с «ручным» элементом (используя XmlNode). Но проблема в том, что он отображает одинаковые ссылки во всех ячейках GridView (потому что он берет «ручные» элементы из всего XML-документа), но он должен быть разным для каждой строки.

Пожалуйста, смотрите мой .xml файл, .cs файл и .aspx страница ниже.

XML-файл:

<?xml version="1.0" encoding="utf-8" ?>
<document_topics>
  <release id="936896294">
    <topic>
      <name>
        Account Connect
      </name>
      <document>
        <![CDATA[<a href="DocumentLocator.aspx?dn=AT100000&r=936896294">AT100000</a><br>
      <a href="DocumentLocator.aspx?dn=AT100010&r=936896294">AT100010</a><br>
      <a href="DocumentLocator.aspx?dn=AT100020&r=936896294">AT100020</a><br>
      <a href="DocumentLocator.aspx?dn=AT100030&r=936896294">AT100030</a><br>
      <a href="DocumentLocator.aspx?dn=AT100040&r=936896294">AT100040</a>]]>
      </document>
      <manual>
        RR320000
      </manual>
      <project>
      </project>
    </topic>
    <topic>
      <name>
        Bankruptcy Proof of Claim
      </name>
      <document>
        <![CDATA[<a href="DocumentLocator.aspx?dn=PM400692&r=936896294">PM400692</a><br>
      <a href="DocumentLocator.aspx?dn=RP1212001&r=936896294">RP1212001</a><br>
      <a href="DocumentLocator.aspx?dn=RP1212002&r=936896294">RP1212002</a><br>
      <a href="DocumentLocator.aspx?dn=SP027POCF&r=936896294">SP027POCF</a><br>
      <a href="DocumentLocator.aspx?dn=SP027POCL&r=936896294">SP027POCL</a><br>]]>
      </document>
      <manual>
        TR320010
      </manual>
      <manual>
        TR320020
      </manual>
      <project>
        PD55588
      </project>
      <project>
        PD23459
      </project>
    </topic>
  </release>
</document_topics>

`

.aspx (часть с кодом GridView):

<asp:GridView ID="gvDocumentTopics" SkinID="MainGrid" EmptyDataText="No Results" Width="100%" runat="server">
<Columns>
    <asp:TemplateField ItemStyle-Width="25%" HeaderText="Topic">
        <ItemTemplate>
            <%# XPath("name").ToString() %>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField ItemStyle-Width="25%" HeaderText="Document Reference">
        <ItemTemplate>
            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="" Text='<%# XPath("document").ToString() %>'></asp:HyperLink>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField ItemStyle-Width="25%" HeaderText="Manual Reference">
        <ItemTemplate>
            <%foreach (var link in links)
                {%>
            <%=link%><br />
            <%}%>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField ItemStyle-Width="25%" HeaderText="Related Project">
        <ItemTemplate>
            <%# XPath("project").ToString() %>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

Я использовал C # для чтения XML.

using Latitude.Web.Helpers;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;

namespace Latitude.Web
{
    public partial class Index : System.Web.UI.Page
    {
        public List<string> links = new List<string>();
        public string link;
        public string relId;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["relId"] != null)
            {
                relId = ValidationHelper.ValidateReleaseIdString(Request.QueryString["relId"], ExceptionHelper.GetValidReleaseException(Request.QueryString["relId"]));
                XmlDataSource1.DataFile = Server.MapPath("~/App_Data/IndexItems.xml");
                XmlDataSource1.XPath = "document_topics/release[@id='" + relId + "']/topic";
                XmlDataSource1.DataBind();

                gvDocumentTopics.DataSource = XmlDataSource1;
                gvDocumentTopics.DataBind();

                XmlDocument doc = new XmlDocument();
                doc.Load(Server.MapPath("~/App_Data/IndexItems.xml"));

                XmlNodeList manualsXML = doc.SelectNodes("document_topics/release[@id='" + relId + "']/topic/manual");

                foreach (XmlNode xNode in manualsXML)
                {
                    string manual = xNode.InnerText;

                    if (!String.IsNullOrEmpty(manual))
                    {
                        string link = String.Format("<a href=\"DocumentLocator.aspx?dn={0}&r={1}\">{0}</a>", manual, relId);
                        links.Add(link);
                    }
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 08 октября 2019

Я помещаю результаты в таблицу данных. Вы можете изменить и поместить в любой объект

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq;
using System.Data;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Topic Name", typeof(string));
            dt.Columns.Add("Manual", typeof(string));
            dt.Columns.Add("Project", typeof(string));
            dt.Columns.Add("Document", typeof(string));
            dt.Columns.Add("HREF", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);
            string pattern = "href=\"(?'href'[^\"]+)\">(?'innertext'[^<]+)";
            foreach (XElement topic in doc.Descendants("topic"))
            {
                string name = (string)topic.Element("name");
                string manual = string.Join(",", topic.Elements("manual").Select(x => ((string)x).Trim()));
                string project = string.Join(",",topic.Elements("project").Select(x => ((string)x).Trim()));

                XElement document = topic.Element("document");

                string items = document.Value;
                MatchCollection matches = Regex.Matches(items, pattern);
                foreach (Match match in matches)
                {
                    dt.Rows.Add(new object[] {
                        name,
                        manual,
                        project,
                        match.Groups["innertext"].Value,
                        match.Groups["href"].Value
                    });
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...