Jump to content

XSD e XML em VB.Net


AntonioCS
Go to solution Solved by jpaulino,

Recommended Posts

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

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

  • 3 weeks later...

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

Olá 🙂 Bem existe uma maneira mais "preguiçosa" ... podes gravar, depois ler e apagar essa linha através do código ...

Edited 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

  • Solution

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.