none
Gerar XML

    Question

  • BOm dia,

    Sou iniciante em C# e gostaria de saber como posso gerar um XML de dum datatable populado por um arquivo excel.

    o codigo do botao junto com o datatable é esse:

     

    private void btnImportar_Click(object sender, EventArgs e)
    {
    
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    string arquivosalvo = openFileDialog1.FileName;
    DataTable
    dados = DadosExcelXLS(arquivosalvo);
    dgvXls.DataSource = dados;
    }
    }
    private void EscreverExcelXLS(DataTable Tabela, string CaminhoXLS)
    {
    }
    
    private DataTable DadosExcelXLS(string ArquivoXLS)
    {
    Char aspas = '"';
    string Conexao = "Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source=" + ArquivoXLS + ";"+"Extended Properties=" + aspas + "Excel 8.0;HDR=Yes"+ aspas;
    System.Data.OleDb.OleDbConnection Cn = new System.Data.OleDb.OleDbConnection();
    Cn.ConnectionString = Conexao;
    Cn.Open();
    object[] Restricoes = { null, null, null, "TABLE"};
    DataTable DTSchema = Cn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, Restricoes);
    if (DTSchema.Rows.Count > 0)
    {
    string Sheet = DTSchema.Rows[0]["TABLE_NAME"].ToString();
    System.Data.OleDb.OleDbCommand Comando = new System.Data.OleDb.OleDbCommand("SELECT * FROM [" + Sheet + "]", Cn);
    DataTable Dados = new DataTable();
    System.Data.OleDb.OleDbDataAdapter DA = new System.Data.OleDb.OleDbDataAdapter(Comando);
    DA.Fill(Dados);
    Cn.Close();
    
    return Dados;
    }
    return null;
    }


    Obrigado desde já.

     

     


    Wednesday, August 10, 2011 2:32 PM

Answers

  • voce pode transformar um datable em XML manualmente:

    private XmlDocument DataTableToXmlDocument(ref DataTable dt)
    {
     XmlDocument xml= new XmlDocument();
     StringBuilder sb = new StringBuilder();
    
     sb.Append("<?xml version='1.0' encoding='utf-8' ?>");
     sb.Append("<DocumentElement>");
    
     foreach (DataRow dr in dt.Rows)
     {
      sb.Append("<" + dt.TableName + ">");
    
      foreach (DataColumn dc in dt.Columns)
       sb.Append("<" + dc.ColumnName + ">" +
           dr[dc].ToString() +
          "</" + dc.ColumnName + ">");
    
       sb.Append("</" + dt.TableName + ">");
     }
    
     sb.Append("</DocumentElement>");
     xml.LoadXml(sb.ToString());
    
     return xml;
    }
    

    ou

    usar o metodo WriteXml

    http://msdn.microsoft.com/en-us/library/system.data.datatable.writexml.aspx

     

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Proposed as answer by Breno Riba Wednesday, August 10, 2011 3:54 PM
    • Marked as answer by Harley AraujoOwner Tuesday, August 16, 2011 1:54 PM
    Wednesday, August 10, 2011 2:51 PM
  • Ele fica na memoria. Para utiliza-lo, implemente o seguinte codigo no seu botao:

    private void btnImportar_Click(object sender, EventArgs e)
    {
    
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    string arquivosalvo = openFileDialog1.FileName;
    DataTable dados = DadosExcelXLS(arquivosalvo);
    dgvXls.DataSource = dados;
    XmlDocument xmlDoc= DataTableToXmlDocument(dados);
    xmlDoc.Save(@"c:\temp\data.xml");
    }
    }
    


    ou 

    private void btnImportar_Click(object sender, EventArgs e)
    {
    
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    string arquivosalvo = openFileDialog1.FileName;
    DataTable dados = DadosExcelXLS(arquivosalvo);
    dgvXls.DataSource = dados;
    dados.WriteXml(@"c:\temp\teste.xml");
    }
    }


    A diferença dos dois é que o primeiro usa o mento manual e o segundo o nativo... o metodo nativo guarda a informaçao completa. O primeiro tem a vantagem que vc pode controlar o formato de saida do XML selecionando somente a informaçao que vc precisa... 

    Porem o segundo pode ser facilmente convertido em Datatable outra vez caso vc precise outra vez trabalhar com datatable.

     

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    Wednesday, August 10, 2011 5:00 PM

All replies

  • voce pode transformar um datable em XML manualmente:

    private XmlDocument DataTableToXmlDocument(ref DataTable dt)
    {
     XmlDocument xml= new XmlDocument();
     StringBuilder sb = new StringBuilder();
    
     sb.Append("<?xml version='1.0' encoding='utf-8' ?>");
     sb.Append("<DocumentElement>");
    
     foreach (DataRow dr in dt.Rows)
     {
      sb.Append("<" + dt.TableName + ">");
    
      foreach (DataColumn dc in dt.Columns)
       sb.Append("<" + dc.ColumnName + ">" +
           dr[dc].ToString() +
          "</" + dc.ColumnName + ">");
    
       sb.Append("</" + dt.TableName + ">");
     }
    
     sb.Append("</DocumentElement>");
     xml.LoadXml(sb.ToString());
    
     return xml;
    }
    

    ou

    usar o metodo WriteXml

    http://msdn.microsoft.com/en-us/library/system.data.datatable.writexml.aspx

     

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    • Proposed as answer by Breno Riba Wednesday, August 10, 2011 3:54 PM
    • Marked as answer by Harley AraujoOwner Tuesday, August 16, 2011 1:54 PM
    Wednesday, August 10, 2011 2:51 PM
  • Willian,

    Esse codigo vai aonde? junto com o cdigo do botão, outra coisa, onde que fica gravado sesse XML?

    Obrigado pelo apoio!

    Wednesday, August 10, 2011 4:31 PM
  • O XML não ficará gravado, vc irá gerar este XML a partir do retorno do banco e então armazená-lo se quiser..
    Wednesday, August 10, 2011 4:36 PM
  • Ele fica na memoria. Para utiliza-lo, implemente o seguinte codigo no seu botao:

    private void btnImportar_Click(object sender, EventArgs e)
    {
    
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    string arquivosalvo = openFileDialog1.FileName;
    DataTable dados = DadosExcelXLS(arquivosalvo);
    dgvXls.DataSource = dados;
    XmlDocument xmlDoc= DataTableToXmlDocument(dados);
    xmlDoc.Save(@"c:\temp\data.xml");
    }
    }
    


    ou 

    private void btnImportar_Click(object sender, EventArgs e)
    {
    
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    string arquivosalvo = openFileDialog1.FileName;
    DataTable dados = DadosExcelXLS(arquivosalvo);
    dgvXls.DataSource = dados;
    dados.WriteXml(@"c:\temp\teste.xml");
    }
    }


    A diferença dos dois é que o primeiro usa o mento manual e o segundo o nativo... o metodo nativo guarda a informaçao completa. O primeiro tem a vantagem que vc pode controlar o formato de saida do XML selecionando somente a informaçao que vc precisa... 

    Porem o segundo pode ser facilmente convertido em Datatable outra vez caso vc precise outra vez trabalhar com datatable.

     

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    Wednesday, August 10, 2011 5:00 PM