Usuário com melhor resposta
Linq + XML + Vb.Net

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.
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....- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 14 de dezembro de 2010 11:39
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 17 de fevereiro de 2011 14:23
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 -
-
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....- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 14 de dezembro de 2010 11:39
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 17 de fevereiro de 2011 14:23
-
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.... -
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!
-
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!
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
-
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