none
Linq + XML + Vb.Net RRS feed

  • Pergunta

  • Tenho pesquisado bastante sobre Linq com XML no Vb.Net mas estou encontrando problemas no meu atual projeto. Os exemplos que vi, como esse: http://www.aspfree.com/c/a/VB.NET/LINQ-to-XML-Programming-Using-Visual-BasicNET-2008/ funcionam no xml do próprio exemplo, mas ao utilizar o meu não obtenho resultado.

    O arquivo XML é o seguinte:

     

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <DetalheMovimentoMensal xmlns="http://www.tce.sp.gov.br/audesp/xml/dadoscontabeis" xmlns:aux="http://www.tce.sp.gov.br/audesp/xml/auxiliar" xmlns:cadc="http://www.tce.sp.gov.br/audesp/xml/cadastroscontabeis" xmlns:gen="http://www.tce.sp.gov.br/audesp/xml/generico" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tce.sp.gov.br/audesp/xml/dadoscontabeis ../dadoscontabeis/AUDESP_ContasCorrentes_2010_A.xsd">
     <Descritor>
      <gen:AnoExercicio>2010</gen:AnoExercicio>
      <gen:TipoDocumento>BALANCETE-ISOLADO-CONTA-CORRENTE</gen:TipoDocumento>
      <gen:Entidade>3</gen:Entidade>
      <gen:Municipio>6361</gen:Municipio>
      <gen:DataCriacaoXML>2010-11-30</gen:DataCriacaoXML>
      <gen:MesExercicio>1</gen:MesExercicio>
     </Descritor>
     <ContasCorrentes>
      <Contratos>
       <Entidade>3</Entidade>
       <Credor>
        <gen:CNPJ Tipo="01">
         <gen:Numero>00626646000189</gen:Numero>
        </gen:CNPJ>
       </Credor>
       <NumeroContrato>
        <gen:Numero>12</gen:Numero>
        <gen:Ano>2009</gen:Ano>
       </NumeroContrato>
       <ContaContabil>199720200</ContaContabil>
       <MovimentoContabil>
        <SaldoInicial>29480.00</SaldoInicial>
        <NatInicial>D</NatInicial>
        <MovimentoCredito>2680.00</MovimentoCredito>
        <MovimentoDebito>0.00</MovimentoDebito>
        <SaldoFinal>26800.00</SaldoFinal>
        <NatFinal>D</NatFinal>
       </MovimentoContabil>
      </Contratos>
      <Contratos>
       <Entidade>3</Entidade>
       <Credor>
        <gen:CNPJ Tipo="01">
         <gen:Numero>04366850000169</gen:Numero>
        </gen:CNPJ>
       </Credor>
       <NumeroContrato>
        <gen:Numero>11</gen:Numero>
        <gen:Ano>2009</gen:Ano>
       </NumeroContrato>
       <ContaContabil>199720200</ContaContabil>
       <MovimentoContabil>
        <SaldoInicial>45500.00</SaldoInicial>
        <NatInicial>D</NatInicial>
        <MovimentoCredito>6500.00</MovimentoCredito>
        <MovimentoDebito>0.00</MovimentoDebito>
        <SaldoFinal>39000.00</SaldoFinal>
        <NatFinal>D</NatFinal>
       </MovimentoContabil>
      </Contratos>
      <Contratos>
       <Entidade>3</Entidade>
       <Credor>
        <gen:CNPJ Tipo="01">
         <gen:Numero>07865519000181</gen:Numero>
        </gen:CNPJ>
       </Credor>
       <NumeroContrato>
        <gen:Numero>7</gen:Numero>
        <gen:Ano>2009</gen:Ano>
       </NumeroContrato>
       <ContaContabil>199720200</ContaContabil>
       <MovimentoContabil>
        <SaldoInicial>45500.00</SaldoInicial>
        <NatInicial>D</NatInicial>
        <MovimentoCredito>6500.00</MovimentoCredito>
        <MovimentoDebito>0.00</MovimentoDebito>
        <SaldoFinal>39000.00</SaldoFinal>
        <NatFinal>D</NatFinal>
       </MovimentoContabil>
      </Contratos>
     </ContasCorrentes>
    </DetalheMovimentoMensal>
    

     

    Gostaria de ler esse arquivo e colocar num grid como o do exemplo, ou poder gravá-lo (manipular os dados). A idéia seria passar para um cadastro de contratos mas podendo manipular os dados linha à linha (ou por registro).

     

    Obrigado.

    sexta-feira, 10 de dezembro de 2010 11:01

Respostas

  • Ola Jose,

    Voce pode criar uma classe para serializar os dados e depois usar o Linq se necessario para consultas...

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    
    public class DetalheMovimentoMensal {
      [XmlNamespaceDeclarations]
      public XmlSerializerNamespaces xmlns;
    
      public Descritor Descritor { get; set; }
    
      [XmlArray("ContasCorrentes"), XmlArrayItem("Contratos")]
      public List<Contratos> Contratos { get; set; }
    
      public DetalheMovimentoMensal() {
        xmlns = new XmlSerializerNamespaces();
        xmlns.Add("aux", "http://www.tce.sp.gov.br/audesp/xml/auxiliar");
        xmlns.Add("cadc", "http://www.tce.sp.gov.br/audesp/xml/cadastroscontabeis");
        xmlns.Add("gen", "http://www.tce.sp.gov.br/audesp/xml/generico");
        xmlns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    
        Descritor = new Descritor();
      }
    
      public static DetalheMovimentoMensal Parse(FileInfo xmlfile) {
        if (!xmlfile.Exists) return new DetalheMovimentoMensal();
    
        XmlSerializer serializer = new XmlSerializer(typeof(DetalheMovimentoMensal), "http://www.tce.sp.gov.br/audesp/xml/dadoscontabeis");
        return (DetalheMovimentoMensal)serializer.Deserialize(xmlfile.OpenRead());
      }
    
      public void Save(string fileName) {
        XmlSerializer serializer = new XmlSerializer(typeof(DetalheMovimentoMensal), "http://www.tce.sp.gov.br/audesp/xml/dadoscontabeis");
        using (var writer = XmlWriter.Create(fileName)) {
          serializer.Serialize(writer, this);
          writer.Flush();
          writer.Close();
        }        
      }
    }
    
    public class Descritor {
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int AnoExercicio { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public string TipoDocumento { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Entidade { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Municipio { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public DateTime DataCriacaoXML { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int MesExercicio { get; set; }
    }
    
    public class Contratos {
      public int Entidade { get; set; }
      public Credor Credor { get; set; }
      public AnoNumero NumeroContrato { get; set; }
      public int ContaContabil { get; set; }
      public MovimentoContabil MovimentoContabil { get; set; }
    
      public Contratos() {
        this.Credor = new Credor();
        this.NumeroContrato = new AnoNumero();
        this.MovimentoContabil = new MovimentoContabil();
      }
    }
    
    public class Credor {  
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public Documento CNPJ { get; set; }
    
      public Credor() {
        this.CNPJ = new Documento();
      }
    }
    
    public class Documento {
      [XmlAttribute]
      public string Tipo { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public String Numero { get; set; }
    }
    
    public class AnoNumero {
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Numero { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Ano { get; set; }
    }
    
    public class MovimentoContabil {
      public decimal SaldoInicial { get; set; }
      public string NatInicial { get; set; }
      public decimal MovimentoCredito { get; set; }
      public decimal MovimentoDebito { get; set; }
      public decimal SaldoFinal { get; set; }
      public string NatFinal { get; set; }
    }
    

    Exemplo de uso:

    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <script runat="server">   
      protected void Page_Load(object sender, EventArgs e) {
        var detalhes = DetalheMovimentoMensal.Parse(new System.IO.FileInfo(Server.MapPath("~/XMLFile.xml")));
            
        GridView1.DataSource = detalhes.Contratos;
        GridView1.DataBind();
    
        // detalhes.Save(Server.MapPath("~/Teste2.xml"));
      }
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" />
      </form>
    </body>
    </html>
    
    

    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    segunda-feira, 13 de dezembro de 2010 22:05
    Moderador

Todas as Respostas

  • José,

    Como você tentou ler esse XML? Você poderia postar o código aqui?


    André Alves de Lima
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 13 de dezembro de 2010 12:23
    Moderador
  • 1- vc deve carregar esse arquivo carrega ele dentro de um dataset e le via linq
    segunda-feira, 13 de dezembro de 2010 21:17
  • Ola Jose,

    Voce pode criar uma classe para serializar os dados e depois usar o Linq se necessario para consultas...

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    
    public class DetalheMovimentoMensal {
      [XmlNamespaceDeclarations]
      public XmlSerializerNamespaces xmlns;
    
      public Descritor Descritor { get; set; }
    
      [XmlArray("ContasCorrentes"), XmlArrayItem("Contratos")]
      public List<Contratos> Contratos { get; set; }
    
      public DetalheMovimentoMensal() {
        xmlns = new XmlSerializerNamespaces();
        xmlns.Add("aux", "http://www.tce.sp.gov.br/audesp/xml/auxiliar");
        xmlns.Add("cadc", "http://www.tce.sp.gov.br/audesp/xml/cadastroscontabeis");
        xmlns.Add("gen", "http://www.tce.sp.gov.br/audesp/xml/generico");
        xmlns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
    
        Descritor = new Descritor();
      }
    
      public static DetalheMovimentoMensal Parse(FileInfo xmlfile) {
        if (!xmlfile.Exists) return new DetalheMovimentoMensal();
    
        XmlSerializer serializer = new XmlSerializer(typeof(DetalheMovimentoMensal), "http://www.tce.sp.gov.br/audesp/xml/dadoscontabeis");
        return (DetalheMovimentoMensal)serializer.Deserialize(xmlfile.OpenRead());
      }
    
      public void Save(string fileName) {
        XmlSerializer serializer = new XmlSerializer(typeof(DetalheMovimentoMensal), "http://www.tce.sp.gov.br/audesp/xml/dadoscontabeis");
        using (var writer = XmlWriter.Create(fileName)) {
          serializer.Serialize(writer, this);
          writer.Flush();
          writer.Close();
        }        
      }
    }
    
    public class Descritor {
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int AnoExercicio { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public string TipoDocumento { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Entidade { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Municipio { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public DateTime DataCriacaoXML { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int MesExercicio { get; set; }
    }
    
    public class Contratos {
      public int Entidade { get; set; }
      public Credor Credor { get; set; }
      public AnoNumero NumeroContrato { get; set; }
      public int ContaContabil { get; set; }
      public MovimentoContabil MovimentoContabil { get; set; }
    
      public Contratos() {
        this.Credor = new Credor();
        this.NumeroContrato = new AnoNumero();
        this.MovimentoContabil = new MovimentoContabil();
      }
    }
    
    public class Credor {  
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public Documento CNPJ { get; set; }
    
      public Credor() {
        this.CNPJ = new Documento();
      }
    }
    
    public class Documento {
      [XmlAttribute]
      public string Tipo { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public String Numero { get; set; }
    }
    
    public class AnoNumero {
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Numero { get; set; }
    
      [XmlElement(Namespace = "http://www.tce.sp.gov.br/audesp/xml/generico")]
      public int Ano { get; set; }
    }
    
    public class MovimentoContabil {
      public decimal SaldoInicial { get; set; }
      public string NatInicial { get; set; }
      public decimal MovimentoCredito { get; set; }
      public decimal MovimentoDebito { get; set; }
      public decimal SaldoFinal { get; set; }
      public string NatFinal { get; set; }
    }
    

    Exemplo de uso:

    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <script runat="server">   
      protected void Page_Load(object sender, EventArgs e) {
        var detalhes = DetalheMovimentoMensal.Parse(new System.IO.FileInfo(Server.MapPath("~/XMLFile.xml")));
            
        GridView1.DataSource = detalhes.Contratos;
        GridView1.DataBind();
    
        // detalhes.Save(Server.MapPath("~/Teste2.xml"));
      }
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" />
      </form>
    </body>
    </html>
    
    

    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    segunda-feira, 13 de dezembro de 2010 22:05
    Moderador
  • Mas so lembrando que o governo disponibiliza os XSD deste sistema

    http://www.tce.sp.gov.br/fiscalizacao/audesp/leiaute_info-2008.shtm

    A partir deles vc pode criar essas mesmas classes q fiz automaticamente

    http://quickstart.developerfusion.co.uk/quickstart/howto/doc/xmlserialization/XSDToCls.aspx


    Eu não sou pago para postar aqui... faço simplesmente porque eu quero....
    segunda-feira, 13 de dezembro de 2010 22:08
    Moderador
  • Estou tentando transformar através do que foi apontado, mas a ferramente xsd.exe exibe mensagens de erro apontando que faltam outros xsd's. Já coloquei todos na mesma pasta mas nada. Ele sempre fará referencia ao arquivo que está na internet?

    Desculpem as perguntas simples, mas é a primeira vez que mexo com isso e tô levando uma surra!

     

    Abraço!

    segunda-feira, 20 de dezembro de 2010 11:32
  • Private Sub AbrirXmlReader()
    
        'http://www.aspfree.com/c/a/VB.NET/LINQ-to-XML-Programming-Using-Visual-BasicNET-2008/1/
    
        'Dim ArquivoXML As XElement = XElement.Load("c:\contacorrente.xml")
        'Dim clientes = From c In ArquivoXML...<DetalheMovimentoMensal>
    
    
        'For Each cliente In clientes
        '  TextBox1.Text &= cliente.ToString & vbNewLine
        'Next
    
        Dim doc As XDocument = XDocument.Load("c:\contacorrente.xml")
        'Dim qList = From xe In doc.XPathSelectElements("//DisponibilidadeFinanceira") _
        '      Select New With { _
        '          .ID = xe.Attribute("ID").Value, _
        '          .Empno = xe.Element("Empno").Value, _
        '          .Ename = xe.Element("Ename").Value, _
        '          .Sal = xe.Element("Sal").Value, _
        '          .Deptno = xe.Element("Deptno").Value _
        '          }
    
        Dim qList = From xe In doc.Descendants.Elements("DisponibilidadeFinanceira") _
              Select New With { _
                  .Entidade = xe.Element("Entidade").Value, _
                  .FonteRecursos = xe.Element("FonteRecursos").Value, _
                  .CodigoAplicacao = xe.Element("CodigoAplicacao").Value, _
                  .ContaContabil = xe.Element("ContaContabil").Value _
                  }
    
       
        Me.DataGridView1.DataSource = qList.ToList
    
      End Sub
    
    Tô tentando com o código acima, mas não tá funcionando. No xml do exemplo até funciona, mas quando passo pro meu, não vai!
    segunda-feira, 20 de dezembro de 2010 11:34
  • José,

    Conseguiu solucionar essa questão?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quinta-feira, 13 de janeiro de 2011 11:39
    Moderador