Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leandro Diniz

[Resolvido] XML - DataTable

Recommended Posts

Ola !

 

Estou no meio de um projeto e dei uma empacada !

 

Tenho que alimentar um arquivo xml com os pedidos do cliente, ou seja assim que o cliente seleciona o produto em um Grid (alimentado pelo db do cliente), tenho que verificar se o ID cliente existe no xml, caso nao exista ele cria e adiciona o item, igual a um carrinho de compras, e no final quando o cliente finalizar vou gravar no db do cliente o pedido e apagar o cliente do xml.

 

Criei um datatable e com ele estou populando meu gridview, acontece que só mostra 1 item do nó Itens ! Se eu der um Response.Write ele imprime certo na tela.

 

Alguem pode dar uma força no codigo abaixo ou sugerir o melhor metodo ?

 

XML

<?xml version="1.0" encoding="utf-8" ?>
<Pedidos>
	<Cliente ID="1">
		<Itens>
			<Produto>10574</Produto>
			<Qt>33</Qt>
		</Itens>
		<Itens>
			<Produto>34174</Produto>
			<Qt>44</Qt>
		</Itens>
	</Cliente>
	<Cliente ID="2">
		<Itens>
			<Produto>99999</Produto>
			<Qt>33</Qt>
		</Itens>
		<Itens>
			<Produto>88888</Produto>
			<Qt>44</Qt>
		</Itens>
	</Cliente>
</Pedidos>

 

XmlDocument doc = new XmlDocument();
		doc.Load(Server.MapPath(@"App_Data\Pedidos.xml"));


		DataTable tb_pedidos = new DataTable();
		tb_pedidos.Columns.Add(new DataColumn("Produto", typeof(string)));
		tb_pedidos.Columns.Add(new DataColumn("Qt", typeof(string)));
		DataRow linha = tb_pedidos.NewRow();

		XmlNodeList Itens = doc.SelectNodes("/Pedidos/Cliente[@ID='2']/Itens");
		foreach (XmlNode a in Itens)
		{
			for (int i = 0; i <= Itens.Count - 1; i++)
			{
				linha[0] = a.SelectSingleNode("Produto").InnerText;
				linha[1] = a.SelectSingleNode("Qt").InnerText;
				//Response.Write(a.SelectSingleNode("Produto").InnerText + "<br />");
			}

		}
		tb_pedidos.Rows.Add(linha);

		//PREENCHENDO GRID
		GridView1.DataSource = tb_pedidos;
		GridView1.DataBind();

Compartilhar este post


Link para o post
Compartilhar em outros sites

O comando que adiciona a linha ao DataTable está fora do laço, ou seja, ele adiciona apenas o ultimo item.

 

Coloque o comando linha = tb_pedidos.NewRow(); no início e o comando tb_pedidos.Rows.Add(linha); no final do comando foreach

DataRow linha = null;
foreach(blablabla)
{
	linha = tb_pedidos.NewRow();

	...
	blablabla;
	...

	tb_pedidos.Rows.Add(linha);
}

Não entendi o porque do laço for dentro do laço foreach, mas beleza.

 

 

 

 

Ola !

 

Estou no meio de um projeto e dei uma empacada !

 

Tenho que alimentar um arquivo xml com os pedidos do cliente, ou seja assim que o cliente seleciona o produto em um Grid (alimentado pelo db do cliente), tenho que verificar se o ID cliente existe no xml, caso nao exista ele cria e adiciona o item, igual a um carrinho de compras, e no final quando o cliente finalizar vou gravar no db do cliente o pedido e apagar o cliente do xml.

 

Criei um datatable e com ele estou populando meu gridview, acontece que só mostra 1 item do nó Itens ! Se eu der um Response.Write ele imprime certo na tela.

 

Alguem pode dar uma força no codigo abaixo ou sugerir o melhor metodo ?

 

XML

<?xml version="1.0" encoding="utf-8" ?>
<Pedidos>
	<Cliente ID="1">
		<Itens>
			<Produto>10574</Produto>
			<Qt>33</Qt>
		</Itens>
		<Itens>
			<Produto>34174</Produto>
			<Qt>44</Qt>
		</Itens>
	</Cliente>
	<Cliente ID="2">
		<Itens>
			<Produto>99999</Produto>
			<Qt>33</Qt>
		</Itens>
		<Itens>
			<Produto>88888</Produto>
			<Qt>44</Qt>
		</Itens>
	</Cliente>
</Pedidos>

 

XmlDocument doc = new XmlDocument();
		doc.Load(Server.MapPath(@"App_Data\Pedidos.xml"));


		DataTable tb_pedidos = new DataTable();
		tb_pedidos.Columns.Add(new DataColumn("Produto", typeof(string)));
		tb_pedidos.Columns.Add(new DataColumn("Qt", typeof(string)));
		DataRow linha = tb_pedidos.NewRow();

		XmlNodeList Itens = doc.SelectNodes("/Pedidos/Cliente[@ID='2']/Itens");
		foreach (XmlNode a in Itens)
		{
			for (int i = 0; i <= Itens.Count - 1; i++)
			{
				linha[0] = a.SelectSingleNode("Produto").InnerText;
				linha[1] = a.SelectSingleNode("Qt").InnerText;
				//Response.Write(a.SelectSingleNode("Produto").InnerText + "<br />");
			}

		}
		tb_pedidos.Rows.Add(linha);

		//PREENCHENDO GRID
		GridView1.DataSource = tb_pedidos;
		GridView1.DataBind();

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Pedro !

 

Realmente nao sei o pq coloquei o for, sabe como é chega uma hora q é melhos descansar um pouco, obrigado.

 

]
DataRow linha = null;
		foreach (XmlNode a in Itens)
		{
			linha = tb_pedidos.NewRow();

			linha[0] = a.SelectSingleNode("Produto").InnerText;
			linha[1] = a.SelectSingleNode("Qt").InnerText;

			tb_pedidos.Rows.Add(linha);
		}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.