大家好,我希望你有一个愉快的周末。
我有一个asp.net转发器,它接收来自XML文件的数据,这个XML文件包含以下数据:
PrintWriter
问题是,它不断重复可空数据。输出应该是这样的:
但输出就像这样:
你能帮帮我吗?我还会将代码粘贴到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;
}
}
答案 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;
}
}
}