AntonioCS Posted June 18, 2012 at 08:33 PM Report Share #463822 Posted June 18, 2012 at 08:33 PM 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 at 08:08 PM Report Share #464208 Posted June 19, 2012 at 08:08 PM 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 at 09:06 PM Author Report Share #464234 Posted June 19, 2012 at 09:06 PM 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 at 10:23 PM Report Share #464490 Posted June 20, 2012 at 10:23 PM 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 at 10:50 AM Author Report Share #467650 Posted July 6, 2012 at 10:50 AM 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 at 10:59 AM Report Share #467658 Posted July 6, 2012 at 10:59 AM (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 at 10:59 AM 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 at 05:06 PM Solution Report Share #467744 Posted July 6, 2012 at 05:06 PM 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 at 05:51 PM Author Report Share #467762 Posted July 6, 2012 at 05:51 PM 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