XML / C # - How to create tags containing other tags inside it

3

Allah Personal I have the following problem: I need to create a product xml file, in which each product will have a group, so that's fine, just by adding the data it creates the product tag and inside it creates the group , just when creating the product and go add the group it is always doing as follows find the first product tag and add all the groups. So how would I do for him to always add the group to the last product tag.

Expected result:

<?xml version="1.0"?>    
-<fdv>    
<data>05/12/2012 17:41:08</data>    
<vendedor>V001</vendedor>   

-<valores>  

-<produto>    
<codigoImport>000083</codigoImport>    
<descricao>MAÇANETA GOL</descricao>    
<un>PÇ</un>    
<precoVenda>12.5</precoVenda>    
<estoque>180</estoque>    
<codBarras>00000833</codBarras>    
<url>http://user.img.todaoferta.uol.com.br/5/P/JO/NDEDP</url>    
<obs>Aplicado em veículo modelo: 2001 2002 2003</obs>    
-<grupo>    
<codigoImport>1001</codigoImport>    
<descricao>PORTAS</descricao>    
</grupo>    
</produto>   

-<produto>    
<codigoImport>000084</codigoImport>    
<descricao>MAÇANETA PALIO</descricao>    
<un>PÇ</un>    
<precoVenda>15</precoVenda>    
<estoque>200</estoque>    
<codBarras>00000840</codBarras>    
<url>http://www.takamineacessorios.com.br/prdfotos/prd_</url>    
<obs>Aplicados em modelos: 2006 2007 2008 2009 2010</obs> 

-<grupo>    
<codigoImport>1001</codigoImport>    
<descricao>PORTAS</descricao>    
</grupo>    
</produto>        
</valores>    
</fdv>

This is my code according to the example of Marco Antonio Quintal, now as I said he will only be creating the last record:

#define Windows_Application
using System;
using System.Data;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Collections;
using System.Xml.Linq;
using System.Xml.XPath;

namespace GSD
{
    class XmlProduto3
    {
        //Diretorio do arquivo Xml;
        private string diretorioArqXml()
        {
            string diretorio = Directory.GetCurrentDirectory();
            string mensagem = String.Empty;
            string caminho = diretorio.Trim() + @"\XML\";

            if (!Directory.Exists(caminho))
            {
                Directory.CreateDirectory(caminho);
            }
            return caminho;
        }

        //Cria o arquivo Xml;
        public void criarArqXml()
        {
            string caminho = diretorioArqXml() + "impprodutos.xml";
            string sqlFunCod = @"SELECT FUNCOD FROM SYS_USUARIO WHERE CODUSU = " + Engebuilder.Library.ConstEngebuilder.codUsu.ToString().Trim() + "";
            string funcod = Engebuilder.Library.LDataAccess.GetDataToString(sqlFunCod);
            Engebuilder.Library.LDataAccess.ExecuteCommand(sqlFunCod);

            ArrayList VlrProCod = new ArrayList();
            ArrayList VlrProDes = new ArrayList();
            ArrayList VlrProUni = new ArrayList();
            ArrayList VlrProPrc = new ArrayList();
            ArrayList VlrProEst = new ArrayList();
            ArrayList VlrProCodBar = new ArrayList();
            ArrayList VlrProCodGrp = new ArrayList();
            ArrayList VlrProDesGrp = new ArrayList();

            DataSet ds = Engebuilder.Library.LDataAccess.GetDataSet("SELECT "
            + " PRODUTO.PROCOD, "
            + " PRODUTO.PRODESRDZ, "
            + " PRODUTO.PROUNID, "
            + " PRODUTO.PROPRCVDAVAR, "
            + " ESTOQUE.ESTATU, "
            + " PRODUTOAUX.PROCODAUX, "
            + " PRODUTO.GRPCOD, "
            + " GRUPO.GRPDES "
            + " FROM PRODUTO "
            + " INNER JOIN ESTOQUE ON ESTOQUE.PROCOD = PRODUTO.PROCOD "
            + " LEFT JOIN PRODUTOAUX ON PRODUTOAUX.PROCOD = PRODUTO.PROCOD "
            + " LEFT JOIN GRUPO ON GRUPO.GRPCOD = PRODUTO.GRPCOD "
            + " ORDER BY PRODUTO.PROCOD");

            foreach (DataRow row in ds.Tables[0].Rows)
            {
                VlrProCod.Add(row["PROCOD"].ToString().Trim());
                VlrProDes.Add(row["PRODESRDZ"].ToString().Trim());
                VlrProUni.Add(row["PROUNID"].ToString().Trim());
                VlrProPrc.Add(row["PROPRCVDAVAR"].ToString().Trim());
                VlrProEst.Add(row["ESTATU"].ToString().Trim());
                VlrProCodBar.Add(row["PROCODAUX"].ToString().Trim());
                VlrProCodGrp.Add(row["GRPCOD"].ToString().Trim());
                VlrProDesGrp.Add(row["GRPDES"].ToString().Trim());
            }

            for (int i = 0; i < VlrProCod.Count; i++)
            {
                XDocument doc = new XDocument(
                  new XElement("fdv",
                    new XElement("data", DateTime.Now.ToString()),
                    new XElement("vendedor", funcod),
                    new XElement("produto",
                      new XElement("codigoImport", VlrProCod[i].ToString()),
                      new XElement("descricao", VlrProDes[i].ToString()),
                      new XElement("un", VlrProUni[i].ToString()),
                      new XElement("precoVenda", VlrProPrc[i].ToString()),
                      new XElement("estoque", VlrProEst[i].ToString()),
                      new XElement("grupo",
                        new XElement("codigoImport", VlrProCodGrp[i].ToString()),
                        new XElement("descricao", VlrProDesGrp[i].ToString()
                  )
                )
              )
            )
          );

                doc.Save(caminho);
            }
            MessageBox.Show("Dados exportado com sucesso!", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}
    
asked by anonymous 03.01.2015 / 13:56

2 answers

3

You should use the XDocument class

More or less like this to create the sub-levels:

        new XElement("fdv",
            new XElement("vendedor", "V001"),
            new XElement("produto",
                new XElement("codigoImport", "000083"),
                new XElement("grupo",
                    new XElement("codigoImport", "1001")
                )
            )
        )
        .Save("produtos.xml");

I hope I have helped. Any problem please send me a reply.

Complementing the answer: After you've added more code, declare XDocument and root element out of for , and add the other elements in for .

    
03.01.2015 / 16:15
4

That's right, folks, thank you for helping them, the correct code now looks like this:

#define Windows_Application
using System;
using System.Data;
using System.Windows.Forms;

using System.Management;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Collections;
using System.Xml.Linq;
using System.Xml.XPath;

namespace GSD
{
    public class XmlProduto
    {
        public XmlProduto()
        {
        }   

        //Diretorio do arquivo Xml;
        private string diretorioArqXml()
        {
            string diretorio = Directory.GetCurrentDirectory();
            string mensagem = String.Empty;
            string caminho = diretorio.Trim() + @"\XML\";

            if (!Directory.Exists(caminho))
            {
                Directory.CreateDirectory(caminho);
            }
            return caminho;
        }

        //Cria o arquivo Xml;
        public void criarArqXml()
        {
            try
            {
                string caminho = diretorioArqXml() + "impprodutos.xml";

                string sqlFunCod = @"SELECT FUNCOD FROM SYS_USUARIO WHERE CODUSU = " + Engebuilder.Library.ConstEngebuilder.codUsu.ToString().Trim() + "";
                string funcod = Engebuilder.Library.LDataAccess.GetDataToString(sqlFunCod);
                Engebuilder.Library.LDataAccess.ExecuteCommand(sqlFunCod);

                string VlrProCod = String.Empty;
                string VlrProDes = String.Empty;
                string VlrProUni = String.Empty;
                string VlrProPrc = String.Empty;
                string VlrProEst = String.Empty;
                string VlrProCodBar = String.Empty;
                string VlrProCodGrp = String.Empty;
                string VlrProDesGrp = String.Empty;

                DataSet ds = Engebuilder.Library.LDataAccess.GetDataSet("SELECT "
                  + " PRODUTO.PROCOD, "
                  + " PRODUTO.PRODESRDZ, "
                  + " PRODUTO.PROUNID, "
                  + " PRODUTO.PROPRCVDAVAR, "
                  + " ESTOQUE.ESTATU, "
                  + " PRODUTOAUX.PROCODAUX, "
                  + " PRODUTO.GRPCOD, "
                  + " GRUPO.GRPDES "
                  + " FROM PRODUTO "
                  + " INNER JOIN ESTOQUE ON ESTOQUE.PROCOD = PRODUTO.PROCOD "
                  + " LEFT JOIN PRODUTOAUX ON PRODUTOAUX.PROCOD = PRODUTO.PROCOD "
                  + " INNER JOIN SECAO ON SECAO.SECCOD = PRODUTO.SECCOD "
                  + " INNER JOIN GRUPO ON (GRUPO.SECCOD = SECAO.SECCOD "
                  + " AND GRUPO.GRPCOD = PRODUTO.GRPCOD) "
                  + " INNER JOIN SUBGRUPO ON (SUBGRUPO.SECCOD = SECAO.SECCOD "
                  + " AND SUBGRUPO.GRPCOD = GRUPO.GRPCOD "
                  + " AND SUBGRUPO.SGRCOD = PRODUTO.SGRCOD) "
                  + " ORDER BY PRODUTO.PROCOD");


                //Verrifica se o arquivo existe, caso sim o deleta;
                if (File.Exists(caminho))
                {
                    File.Delete(caminho);
                }

                XElement doc = new XElement("fdv");

                doc.Add(new XElement("data", DateTime.Now.ToString()));
                doc.Add(new XElement("vendedor", funcod));
                XElement valores = new XElement("valores");

                foreach (DataRow row in ds.Tables[0].Rows)
                {
                    VlrProCod = row["PROCOD"].ToString().Trim();
                    VlrProDes = row["PRODESRDZ"].ToString().Trim();
                    VlrProUni = row["PROUNID"].ToString().Trim();
                    VlrProPrc = row["PROPRCVDAVAR"].ToString().Trim();
                    VlrProEst = row["ESTATU"].ToString().Trim();
                    VlrProCodBar = row["PROCODAUX"].ToString().Trim();
                    VlrProCodGrp = row["GRPCOD"].ToString().Trim();
                    VlrProDesGrp = row["GRPDES"].ToString().Trim();

                    valores.Add(new XElement("produto",
                      new XElement("codigoImport", VlrProCod),
                      new XElement("descricao", VlrProDes),
                      new XElement("un", VlrProUni),
                      new XElement("precoVenda", VlrProPrc),
                      new XElement("estoque", VlrProEst),
                      new XElement("codBarras", VlrProCodBar),
                      new XElement("url", null),
                      new XElement("obs", null),
                      new XElement("grupo",
                        new XElement("codigoImport", VlrProCodGrp),
                        new XElement("descricao", VlrProDesGrp)
                        )
                       )
                     );
                }

                doc.Add(valores);
                doc.Save(caminho);
                MessageBox.Show("Dados exportado com sucesso!", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
            catch (Exception)
            {

                MessageBox.Show("Ocorreu um erro gerar o arquivo XML!", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}
    
04.01.2015 / 22:59