How do I put the attributes below that are in the node envideclaracaoautodesembaraco
in my vba code. I want my .xml
file to generate the same attributes as the example below.
<enviDeclaracaoAutodesembaraco
xmlns="http://www.sefaz.am.gov.br/autodesembaraco"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd">
<infDeclaracaoMensal versao="01">
<ieContribuinteDeclarante>063010712</ieContribuinteDeclarante>
<anoApresentacao>2024</anoApresentacao>
<mesApresentacao>01</mesApresentacao>
<nomeResponsavel>RAI RODRIGUES</nomeResponsavel>
<foneResponsavel>0000000000</foneResponsavel>
<emailResponsavel>teste@gmail.com.br</emailResponsavel>`
...snip...
Image of attributes in the xml file:
Below my codes that exports an xml file in vba:
Sub xmlExport()
'On Error GoTo ErrHandle
Dim doc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60, newDoc As New MSXML2.DOMDocument60
Dim root As IXMLDOMNode, ItemNode As IXMLDOMNode, yinstanceNode As IXMLDOMNode, UFNode As IXMLDOMElement
Dim DiaAtributos As IXMLDOMAttribute, Atributos As IXMLDOMAttribute, NFatributos As IXMLDOMAttribute
Dim Reconhecer As IXMLDOMElement, ValorBs As IXMLDOMElement, chave As IXMLDOMElement, NumNotas As IXMLDOMElement
Dim NumItens As IXMLDOMElement, Produtos As IXMLDOMElement, NumItemNFe As IXMLDOMElement
Dim CodInterno As IXMLDOMElement, IndGeral As IXMLDOMElement, IndGeralProdutos As IXMLDOMElement
Dim TipoTributação As IXMLDOMElement, Multiplicador As IXMLDOMElement, ValorImposto As IXMLDOMElement
Dim NumeroAtributo As IXMLDOMAttribute, civilityAttrib As IXMLDOMAttribute
Dim IE As IXMLDOMElement, Ano As IXMLDOMElement, Mes As IXMLDOMElement, Nome As IXMLDOMElement, Fone As IXMLDOMElement, Email As IXMLDOMElement
Dim ListaNF As IXMLDOMElement, NF As IXMLDOMElement
Dim nmsp As String
Dim g As Long
' NODE PAI '
nmsp = "http://www.sefaz.am.gov.br/autodesembaraco"
Set root = doc.createElement("enviDeclaracaoAutodesembaraco")
doc.appendChild root
Set DiaAtributos = doc.createAttribute("xsischemaLocation")
DiaAtributos.Value = "http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd"
root.Attributes.setNamedItem DiaAtributos
Set ItemNode = doc.createElement("infDeclaracaoMensal")
root.appendChild ItemNode
Set Atributos = doc.createAttribute("versao")
Atributos.Value = "01"
ItemNode.Attributes.setNamedItem Atributos
Set IE = doc.createElement("ieContribuinteDeclarante")
IE.Text = Range("b2").Value
ItemNode.appendChild IE
Set Ano = doc.createElement("anoApresentacao")
Ano.Text = Range("c2").Value
ItemNode.appendChild Ano
Set Mes = doc.createElement("mesApresentacao")
Mes.Text = Range("d2").Value
ItemNode.appendChild Mes
Set Nome = doc.createElement("nomeResponsavel")
Nome.Text = Range("e2").Value
ItemNode.appendChild Nome
Set Fone = doc.createElement("foneResponsavel")
Fone.Text = Range("f2").Value
ItemNode.appendChild Fone
Set Email = doc.createElement("emailResponsavel")
Email.Text = Range("g2").Value
ItemNode.appendChild Email
Set ListaNF = doc.createElement("listaNotasFiscais")
ItemNode.appendChild ListaNF
For g = 2 To Sheets(1).UsedRange.Rows.Count
NumeroItemNfe = Cells(g, 15)
If NumeroItemNfe = 1 Then
Set NF = doc.createElement("notaFiscal")
ListaNF.appendChild NF
Set NFatributos = doc.createAttribute("numOrdemNota")
NFatributos.Value = Range("h" & g)
NF.setAttributeNode NFatributos
Set chave = doc.createElement("chaveNFe")
chave.Text = Range("j" & g)
NF.appendChild chave
Set Reconhecer = doc.createElement("reconheceNFe")
Reconhecer.Text = Range("L" & g)
NF.appendChild Reconhecer
Set NumItens = doc.createElement("numItens")
NumItens.Text = Range("M" & g)
NF.appendChild NumItens
'Else
'GoTo ProximaInteracao
End If
'ProximaInteracao:
Set Produtos = doc.createElement("produto")
NF.appendChild Produtos
Set NumItemNFe = doc.createElement("numItemNFe")
NumItemNFe.Text = Range("O" & g)
Produtos.appendChild NumItemNFe
Set CodInterno = doc.createElement("codInternoProduto")
CodInterno.Text = Range("P" & g)
Produtos.appendChild CodInterno
Set IndGeral = doc.createElement("indiceCodGeralProduto")
IndGeral.Text = Range("Q" & g)
Produtos.appendChild IndGeral
Set IndGeralProdutos = doc.createElement("codGeralProduto")
IndGeralProdutos.Text = Range("R" & g)
Produtos.appendChild IndGeralProdutos
Set TipoTributação = doc.createElement("codTipoTributacao")
TipoTributação.Text = Range("S" & g)
Produtos.appendChild TipoTributação
Set ValorBs = doc.createElement("valorBaseCalculoItem")
ValorBs.Text = Replace(Format(Range("T" & g), "0.00"), ",", ".")
Produtos.appendChild ValorBs
Set Multiplicador = doc.createElement("valorMultiplicador")
Multiplicador.Text = Replace(Format(Range("U" & g), "0.00"), ",", ".")
Produtos.appendChild Multiplicador
Set ValorImposto = doc.createElement("valorImpostoDeclarado")
ValorImposto.Text = Replace(Format(Range("V" & g), "0.00"), ",", ".")
Produtos.appendChild ValorImposto
Next g
Set NumNotas = doc.createElement("numNotasArquivo")
NumNotas.Text = Range("W2").Value
ItemNode.appendChild NumNotas
xslDoc.LoadXML "<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>" _
& "<xsl:stylesheet version=" & Chr(34) & "1.0" & Chr(34) _
& " xmlns:xsl=" & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _
& "<xsl:strip-space elements=" & Chr(34) & "*" & Chr(34) & " />" _
& "<xsl:output method=" & Chr(34) & "xml" & Chr(34) & " indent=" & Chr(34) & "yes" & Chr(34) & "" _
& " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "/>" _
& " <xsl:template match=" & Chr(34) & "node() | @*" & Chr(34) & ">" _
& " <xsl:copy>" _
& " <xsl:apply-templates select=" & Chr(34) & "node() | @*" & Chr(34) & " />" _
& " </xsl:copy>" _
& " </xsl:template>" _
& "</xsl:stylesheet>"
xslDoc.async = False
doc.transformNodeToObject xslDoc, newDoc
newDoc.Save baseDirectory & projectName & "C:\Users\raI\Downloads\DIA.xml"
MsgBox "Arquivo XML gerado com sucesso!", vbInformation
Exit Sub
'ErrHandle:
'MsgBox Err.Number & " - " & Err.Description, vbCritical
Exit Sub
End Sub
The above codes in visual basic for application export an excel data xml file.
How did the xml file look after changing the code as per the suggestion.
<enviDeclaracaoAutodesembaraco xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sefaz.am.gov.br/autodesembaraco" xsi:schemaLocation="http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd">
<infDeclaracaoMensal xmlns="" versao="01">
The main issues i think you're having are adding the attributs to the root element:
xmlns="http://www.sefaz.am.gov.br/autodesembaraco"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd"
The issue was with how you're creating the namespaces schema location:
Dim doc As New MSXML2.DOMDocument60
Dim root As IXMLDOMNode
Dim nmsp As String, xsi As String, schemaLocation As String
' namespaces and schema location
nmsp = "http://www.sefaz.am.gov.br/autodesembaraco"
xsi = "http://www.w3.org/2001/XMLSchema-instance"
schemaLocation = "http://www.sefaz.am.gov.br/autodesembaraco enviDeclaracaoMensalAuto_v1.02.xsd"
' Create the root element - with namespace - by using createNode (NODE_ELEMENT = 1)
Set root = doc.createNode(NODE_ELEMENT, "enviDeclaracaoAutodesembaraco", nmsp)
doc.appendChild root
xsi
namespace:' Add xmlns:xsi attribute
Set xsiAttr = doc.createAttribute("xmlns:xsi")
xsiAttr.Value = xsi
root.Attributes.setNamedItem xsiAttr
schemaLocation
:' Add xsi:schemaLocation attribute
Set schemaLocationAttr = doc.createAttribute("xsi:schemaLocation")
schemaLocationAttr.Value = schemaLocation