AntonioCS Posted June 18, 2012 Report Share Posted June 18, 2012 Já li e reli aqui no fórum vários tópicos sobre esta matéria, mas nunca encontrei o que realmente procurava. Por isso se houver alguem que me saiba como poderei resolver o meu problema agradeço desde já. Tenho um pequeno programa de faturação e tenho andado a experimentar a colocação dos dados através do ficheiro XSD e convertê-los para XML. A colocação dos dados eu consigo, colocá-los no formato XML também, só ainda não consegui perceber como colocar os dados na ordem que o ficheiro XSD têm. O código para gerar: Dim ds = New DataSet Dim dt = New DataTable Dim dr As DataRow Dim filename As String = "C:\GCSLDados\SAFT\SAFTPT_1_02.XSD" ds.ReadXmlSchema(filename) ' 'Tabela Header dt = ds.Tables("Header") dr = dt.NewRow() dr("AuditFileVersion") = "1.01_01" dr("CompanyID") = "123456789" dr("TaxRegistrationNumber") = "123456789" dr("TaxAccountingBasis") = "F" dr("CompanyName") = "CS" dr("BusinessName") = "CS" dr("FiscalYear") = Now.Year dr("StartDate") = Now.Date.ToString("yyyy-MM-dd") dr("EndDate") = Now.Date.ToString("yyyy-MM-dd") dr("CurrencyCode") = "EUR" dr("DateCreated") = Now.Date.ToString("s") dr("TaxEntity") = "Global" dr("SoftwareCertificateNumber") = "0" dr("ProductCompanyTaxID") = "123456789" dr("ProductID") = "Gestão Comercial" dr("ProductVersion") = "5" dt.Rows.Add(dr) 'Tabela CompannyAddress dt = ds.Tables("CompanyAddress") dr = dt.NewRow() dr("BuildingNumber") = "19" dr("StreetName") = "Rua" dr("AddressDetail") = "Rua" dr("City") = "Lisboa" dr("PostalCode") = "1200-078" dr("Region") = "Lisboa" dr("Country") = "PT" dt.Rows.Add(dr) ds.WriteXml("C:\GCSLDados\SAFT\Zteste.xml") Obtenho um ficheiro XML com os seguintes dados: <?xml version="1.0" standalone="yes"?> <SAF-T_PT xmlns="urn:OECD:StandardAuditFile-Tax:PT_1.01_01"> <Header> <AuditFileVersion>1.01_01</AuditFileVersion> <CompanyID>123456789</CompanyID> <TaxRegistrationNumber>123456789</TaxRegistrationNumber> <TaxAccountingBasis>F</TaxAccountingBasis> <CompanyName>CS</CompanyName> <BusinessName>CS</BusinessName> <FiscalYear>2012</FiscalYear> <StartDate>2012-06-18T00:00:00+01:00</StartDate> <EndDate>2012-06-18T00:00:00+01:00</EndDate> <CurrencyCode>EUR</CurrencyCode> <DateCreated>2012-06-18T00:00:00+01:00</DateCreated> <TaxEntity>Global</TaxEntity> <ProductCompanyTaxID>123456789</ProductCompanyTaxID> <SoftwareCertificateNumber>0</SoftwareCertificateNumber> <ProductID>Gestão Comercial</ProductID> <ProductVersion>5</ProductVersion> </Header> <CompanyAddress> <BuildingNumber>19</BuildingNumber> <StreetName>Rua</StreetName> <AddressDetail>Rua</AddressDetail> <City>Lisboa</City> <PostalCode>1200-078</PostalCode> <Region>Lisboa</Region> <Country>PT</Country> </CompanyAddress> </SAF-T_PT> Acontece que o elemento "CompanyAddress" devia estar dentro do elemento "Header" e por mais voltas que dê não consigo achar a forma. Será que tenho de produzir o ficheiro XML à mão para obter os dados ordenados? Ou existe algum comando em VB Net que faça o serviço. Obrigado pela atenção Link to comment Share on other sites More sharing options...
jpaulino Posted June 19, 2012 Report Share Posted June 19, 2012 Vê este artigo: http://www.jorgepaulino.com/2009/09/vbnet-xml-literals-parte-ii-embedded.html Podes criar a estrutura que queres e depois só tens de indicar os valores (via embedded expressions) Link to comment Share on other sites More sharing options...
AntonioCS Posted June 19, 2012 Author Report Share Posted June 19, 2012 Vê este artigo: http://www.jorgepaul...i-embedded.html Podes criar a estrutura que queres e depois só tens de indicar os valores (via embedded expressions) Obrigado pela informação, vou estudar o artigo e a ver se consigo colocar o XML em ordem. Link to comment Share on other sites More sharing options...
jlpcalado Posted June 20, 2012 Report Share Posted June 20, 2012 Ola AntonioCS. Tens 2 datatables. A 2ª só pode aparecer dentro da 1ª se as relacionares através de algum atributo (neste caso não estou a ver nenhum) Mas imaginando que, por ex., a 'Company' tinha diversas 'Address' (ou mesmo só uma) terias que colocar o atributo 'CompanyID' na tabela 'CompanyAddress' como c. estrangeira, não é verdade? Seguida/ crias uma DataRelation, antes do ds.WriteXml: Dim HeadAddrRel As DataRelation = ds.Relations.Add("HeadAddr", ds.Tables("Header").Columns("CompanyID"), ds.Tables("CompanyAddress").Columns("CompanyID")) Assim cada elemento <CompanyAddress> aparecerá dentro do <Header>. Link to comment Share on other sites More sharing options...
AntonioCS Posted July 6, 2012 Author Report Share Posted July 6, 2012 Tentei utilizar como dizes, mas acontece que não tenho elementos para relacionar as duas tabelas. O elemento <CompanyAddress> é uma 'extensão' embebida no elemento <Header> sem relação. O que estou a tentar é gerar um ficheiro SAFT.xml. Como não consegui obter resultados através do 'DataRelation', virei-me para XML Literals. Onde estou a obter resultados, vou expor o código e a minha dúvida. ' Gera o XML Dim newBookList2 = _ <?xml version="1.0" encoding="windows-1252" standalone="yes"?> <AuditFile xmlns="urn:OECD:StandartAuditFile-Tax:PT_1.01_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Header> <AuditFileVersion>1.01_01</AuditFileVersion> <CompanyID>123456789</CompanyID> <TaxRegistrationNumber>123456789</TaxRegistrationNumber> <TaxAccountingBasis>F</TaxAccountingBasis> <CompanyName>Antonio</CompanyName> <BusinessName>Edições Antonio</BusinessName> <CompanyAddress> <BuildingNumber>19</BuildingNumber> <StreetName>Rua João </StreetName> <AddressDetails>Rua João </AddressDetails> <City>Lisboa</City> <PostalCode>1200-078</PostalCode> <Region>Lisboa</Region> <Country>PT</Country> </CompanyAddress> <FiscalYear><%= Me.DateTimePicker1.Value.Year.ToString %></FiscalYear> <StartDate><%= Me.DateTimePicker1.Value.ToString("yyyy-MM-dd") %></StartDate> <EndDate><%= Me.DateTimePicker3.Value.ToString("yyyy-MM-dd") %></EndDate> <CurrencyCode>EUR</CurrencyCode> <DateCreated><%= Now.Date.ToString("yyyy-MM-dd") %></DateCreated> <TaxEntity>Global</TaxEntity> <ProductCompanyTaxID>123456789</ProductCompanyTaxID> <SoftwareCertificateNumber>0</SoftwareCertificateNumber> <ProductID>Gestão de Livros/</ProductID> <ProductVersion>3.0.0</ProductVersion> </Header> <MasterFiles> <%= From b In ds.Tables("Customer") Select _ <CustomerID> <CustomerID><%= b.Item(0) %></CustomerID> <AccountID><%= b.Item(1) %></AccountID> <CustomerTaxID><%= b.Item(2) %></CustomerTaxID> <CompanyName><%= b.Item(3) %></CompanyName> <SelfBillingIndicator><%= b.Item(9) %></SelfBillingIndicator> </CustomerID> %> </MasterFiles> </AuditFile> 'Grava para o disco newBookList2.Save("C:\GCSLDados\SAFT\result.xml") Como resultado obtenho: <?xml version="1.0" encoding="Windows-1252" standalone="yes"?> <AuditFile xmlns="urn:OECD:StandartAuditFile-Tax:PT_1.01_01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Header> <! --- Aqui aparecem os dados corretos, não coloquei para não alongar o código---/> </Header> <MasterFiles> <CustomerID xmlns=""> <CustomerID>1</CustomerID> <AccountID>Desconhecido</AccountID> <CustomerTaxID>500963436</CustomerTaxID> <CompanyName>Tipografia São Pedro, Lda</CompanyName> <SelfBillingIndicator>0</SelfBillingIndicator> </CustomerID> <CustomerID xmlns=""> <CustomerID>2</CustomerID> <AccountID>Desconhecido</AccountID> <CustomerTaxID>123456789</CustomerTaxID> <CompanyName>Génio</CompanyName> <SelfBillingIndicator>0</SelfBillingIndicator> </CustomerID> </MasterFiles> </AuditFile> A minha dúvida prende-se, no elemento <CustomerID> porque é que aparece <CustomerID xmlns=""> e não só <CustomerID> como eu pretendia. Obrigado Link to comment Share on other sites More sharing options...
Lukas S. Posted July 6, 2012 Report Share Posted July 6, 2012 (edited) Olá 🙂 Bem existe uma maneira mais "preguiçosa" ... podes gravar, depois ler e apagar essa linha através do código ... Edited July 6, 2012 by Lukas S. E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro. Link to comment Share on other sites More sharing options...
Solution jpaulino Posted July 6, 2012 Solution Report Share Posted July 6, 2012 Ele está a incluir o namespace, o que é normal. Tens de "limpar" o XML antes de o gravar, caso contrário, irá sempre incluir. Substitui: newBookList2.Save("C:\GCSLDados\SAFT\result.xml") Por: Dim xmlString As String = newBookList2.ToString().Replace(" xmlns=""""", "") Dim clearXML As New Xml.XmlDocument clearXML.LoadXml(xmlString) clearXML.Save("C:\GCSLDados\SAFT\result.xml") Link to comment Share on other sites More sharing options...
AntonioCS Posted July 6, 2012 Author Report Share Posted July 6, 2012 Obrigado, resultou. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now