Asp.net中继器中的XML分层数据绑定

时间:2018-04-21 11:35:06

标签: c# xml asprepeater

大家好,我希望你有一个愉快的周末。

我有一个asp.net转发器,它接收来自XML文件的数据,这个XML文件包含以下数据:

PrintWriter

问题是,它不断重复可空数据。输出应该是这样的:

Correct Output

但输出就像这样:

Wrong Output

你能帮帮我吗?我还会将代码粘贴到c#中。而且我在创建这个转发器方面有很多限制,在我的项目中,将拥有此代码的机器具有.net框架1,即使我想更新该框架,我也不允许这样做。我还将添加一个实现,如果存在查询字符串,它将过滤xml文件(这部分我不需要帮助)。

这是C#中的代码:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ListaDeRegimes>
<Regime nome="RJR">
    <nome>This is Regime Info</nome>
    <descricao>This is Regime Description</descricao>
    <região nome="Mainland">
        <grupo nome="group1">
            <Serviços>
                <nome>Service1</nome>
                <link>#</link>
            </Serviços>
            <Serviços>
                <nome>Service2</nome>
                <link>#</link>              
            </Serviços>
            <Serviços>
                <nome>Service3</nome>
                <link>#</link>              
            </Serviços>
        </grupo>
        <grupo nome="group2">
            <Serviços>
                <nome>Service1</nome>
                <link>#</link>
            </Serviços>
            <Serviços>
                <nome>Service2</nome>
                <link>#</link>              
            </Serviços>
            <Serviços>
                <nome>Service3</nome>
                <link>#</link>              
            </Serviços> 
        </grupo>
    </região>
    <região nome="Islands">
        <grupo nome="group1">
            <Serviços>
                <nome>Service1</nome>
                <link>#</link>
            </Serviços>
            <Serviços>
                <nome>Service2</nome>
                <link>#</link>              
            </Serviços>
        </grupo>
        <grupo nome="group2">
            <Serviços>
                <nome>Service1</nome>
                <link>#</link>
            </Serviços>
            <Serviços>
                <nome>Service2</nome>
                <link>#</link>              
            </Serviços>
        </grupo>
    </região>   
</Regime>
<Regime nome="AL">
    <nome>This is Regime Name</nome>
    <descricao>This is Regime Description</descricao>
    <região nome="Mainland">
        <grupo>
            <Serviços>
                <nome>Service1</nome>
                <link>#</link>
            </Serviços>
            <Serviços>
                <nome>Service2</nome>
                <link>#</link>              
            </Serviços>
            <Serviços>
                <nome>Service3</nome>
                <link>#</link>              
            </Serviços>
        </grupo>
    </região>
</Regime>

这是用于创建数据表的代码。

        public DataTable GetCategorias()
    {

        DataTable oDataTable = null;
        string[] columnNameList = new string[6] { "NomeDeRegime", "NomeDeDescricao", "NomeDeRegiao", "NomeDeGrupos", "NomeDeServiços", "LinkDeServiços" };
        oDataTable = new DataTable();
        oDataTable.Locale = CultureInfo.InvariantCulture;
        oDataTable = BuildDataTable(columnNameList);

        XmlDocument xmlDoc = new XmlDocument();
        string xmlPath;

        xmlPath = @"C:\Users\Utilizador\Desktop\ListagemdeServiços.xml";
        xmlDoc.Load(xmlPath);
        XmlNodeList ListaDeRegimes = null;

        ListaDeRegimes = xmlDoc.SelectNodes("//ListaDeRegimes");


        //if (ListaDeRegimes != null)


        foreach (XmlNode Regime in ListaDeRegimes)
        {
            string NomeDeRegime = "";
            string NomeDeDescricao = "";
            string NomeDeRegiao = "";
            string NomeDeGrupos = "";
            string NomeDeServiços = "";
            string LinkDeServiços = "";

            XmlNodeList RegimeList = Regime.SelectNodes("//Regime");

            foreach (XmlNode RegimeNode in RegimeList)
            {
                NomeDeRegime = RegimeNode.SelectSingleNode("nome").FirstChild.Value;
                if (RegimeNode.SelectSingleNode("descricao") != null)
                {
                    NomeDeDescricao = RegimeNode.SelectSingleNode("descricao").FirstChild.Value;
                }

                //Listar lista do nome de regiao
                string[] valueList = valueList = new string[6] { NomeDeRegime, NomeDeDescricao, "", "", "", "" };

                oDataTable = DataTableAddRow(oDataTable, valueList);
                foreach (XmlNode childnodes in RegimeNode.ChildNodes)
                {
                    if (childnodes.Name == "região")
                    {
                        if (childnodes.Attributes["nome"].Value != null)
                        {
                            NomeDeRegiao = childnodes.Attributes["nome"].Value;
                        }
                        else
                        {
                            NomeDeRegiao = "";
                        }
                        valueList = new string[6] { "", "", NomeDeRegiao, "", "", "" };

                        oDataTable = DataTableAddRow(oDataTable, valueList);
                        foreach (XmlNode NodeGrupos in childnodes)
                        {
                            if (NodeGrupos.Attributes["nome"] == null)
                            {
                                NomeDeGrupos = "";

                            }
                            else if (NodeGrupos.Attributes["nome"].Value != null)
                            {
                                NomeDeGrupos = NodeGrupos.Attributes["nome"].Value;
                            }
                            else
                            {
                                NomeDeGrupos = "";

                            }
                            valueList = new string[6] { "", "", "", NomeDeGrupos, "", "" };

                            oDataTable = DataTableAddRow(oDataTable, valueList);

                            foreach (XmlNode NodeServiços in NodeGrupos)
                            {

                                if (NodeServiços.SelectSingleNode("nome") != null)
                                {
                                    NomeDeServiços = NodeServiços.SelectSingleNode("nome").FirstChild.Value;

                                    if (NodeServiços.SelectSingleNode("link") != null)
                                    {
                                        LinkDeServiços = NodeServiços.SelectSingleNode("link").FirstChild.Value;

                                    }
                                    else
                                    {
                                        LinkDeServiços = "";

                                    }
                                }
                                else
                                {
                                    NomeDeServiços = "";

                                }


                                valueList = new string[6] { "", "", "", "", NomeDeServiços, LinkDeServiços };

                                oDataTable = DataTableAddRow(oDataTable, valueList);

                            }
                        }
                    }
                }

            }
        }



        return oDataTable;
    }

这是源端的转发器。

        public static DataTable DataTableAddRow(DataTable _oDataTable, string[] _valueList)
    {
        try
        {
            DataRow dtRow = null;
            dtRow = _oDataTable.NewRow();
            for (int ipos = 0; ipos < _valueList.Length; ipos++)
            {
                if (_valueList[ipos] != string.Empty)
                {
                    dtRow[ipos] = _valueList[ipos];
                }

            }
            _oDataTable.Rows.Add(dtRow);

            return _oDataTable;
        }
        catch
        {
            return null;
        }
    }

    public static DataTable BuildDataTable(string[] _columnNameList)
    {
        try
        {
            DataTable oTable = new DataTable();
            oTable.Locale = CultureInfo.InvariantCulture;
            DataColumn dtCol = new DataColumn();
            for (int ipos = 0; ipos < _columnNameList.Length; ipos++)
            {
                dtCol = new DataColumn();
                dtCol.ColumnName = _columnNameList[ipos].ToString();
                oTable.Columns.Add(dtCol);
            }
            return oTable;
        }
        catch
        {
            return null;
        }
    }

1 个答案:

答案 0 :(得分:0)

您没有发布所有代码,因此我使用发布的代码进行了修改以便运行。我没有看到同样的问题所以它必须是未发布的代码。这是我修改过的代码:

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

namespace ConsoleApplication37
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = Test.GetCategorias(FILENAME);
        }
    }
    public class Test
    {
        public static DataTable GetCategorias(string filename)
        {

            DataTable oDataTable = null;
            string[] columnNameList = new string[6] { "NomeDeRegime", "NomeDeDescricao", "NomeDeRegiao", "NomeDeGrupos", "NomeDeServiços", "LinkDeServiços" };
            oDataTable = new DataTable();
            oDataTable.Locale = CultureInfo.InvariantCulture;
            foreach (string columnName in columnNameList)
            {
                oDataTable.Columns.Add(columnName, typeof(string));
            }

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(filename);
            XmlNodeList ListaDeRegimes = null;

            ListaDeRegimes = xmlDoc.SelectNodes("//ListaDeRegimes");


            //if (ListaDeRegimes != null)


            foreach (XmlNode Regime in ListaDeRegimes)
            {
                string NomeDeRegime = "";
                string NomeDeDescricao = "";
                string NomeDeRegiao = "";
                string NomeDeGrupos = "";
                string NomeDeServiços = "";
                string LinkDeServiços = "";

                XmlNodeList RegimeList = Regime.SelectNodes("//Regime");

                foreach (XmlNode RegimeNode in RegimeList)
                {
                    NomeDeRegime = RegimeNode.SelectSingleNode("nome").FirstChild.Value;
                    if (RegimeNode.SelectSingleNode("descricao") != null)
                    {
                        NomeDeDescricao = RegimeNode.SelectSingleNode("descricao").FirstChild.Value;
                    }

                    //Listar lista do nome de regiao
                    string[] valueList = valueList = new string[6] { NomeDeRegime, NomeDeDescricao, "", "", "", "" };

                    oDataTable.Rows.Add(valueList);
                    foreach (XmlNode childnodes in RegimeNode.ChildNodes)
                    {
                        if (childnodes.Name == "região")
                        {
                            if (childnodes.Attributes["nome"].Value != null)
                            {
                                NomeDeRegiao = childnodes.Attributes["nome"].Value;
                            }
                            else
                            {
                                NomeDeRegiao = "";
                            }
                            valueList = new string[6] { "", "", NomeDeRegiao, "", "", "" };

                            oDataTable.Rows.Add(valueList);
                            foreach (XmlNode NodeGrupos in childnodes)
                            {
                                if (NodeGrupos.Attributes["nome"] == null)
                                {
                                    NomeDeGrupos = "";

                                }
                                else if (NodeGrupos.Attributes["nome"].Value != null)
                                {
                                    NomeDeGrupos = NodeGrupos.Attributes["nome"].Value;
                                }
                                else
                                {
                                    NomeDeGrupos = "";

                                }
                                valueList = new string[6] { "", "", "", NomeDeGrupos, "", "" };

                                oDataTable.Rows.Add(valueList);

                                foreach (XmlNode NodeServiços in NodeGrupos)
                                {

                                    if (NodeServiços.SelectSingleNode("nome") != null)
                                    {
                                        NomeDeServiços = NodeServiços.SelectSingleNode("nome").FirstChild.Value;

                                        if (NodeServiços.SelectSingleNode("link") != null)
                                        {
                                            LinkDeServiços = NodeServiços.SelectSingleNode("link").FirstChild.Value;

                                        }
                                        else
                                        {
                                            LinkDeServiços = "";

                                        }
                                    }
                                    else
                                    {
                                        NomeDeServiços = "";

                                    }


                                    valueList = new string[6] { "", "", "", "", NomeDeServiços, LinkDeServiços };

                                    oDataTable.Rows.Add(valueList);

                                }
                            }
                        }
                    }

                }
            }
            return oDataTable;
        }
    }
}